git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v9 3/5] cat-file: teach cat-file a '--allow-unknown-type' option

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 29, 2015, 14:52 UTC
Message-ID
<xmqqpp6nt2a7.fsf@gitster.dls.corp.google.com>
In-Reply-To
<1430312006-23323-1-git-send-email-karthik.188@gmail.com>
Karthik Nayak <karthik.188@gmail.com> writes:
Show 7 quoted lines
> Currently 'git cat-file' throws an error while trying to
> print the type or size of a broken/corrupt object. This is
> because these objects are usually of unknown types.
>
> Teach git cat-file a '--allow-unkown-type' option where it prints
> the type or size of a broken/corrupt object without throwing
> an error.

Drop "Currently" from the description of the problem you are solving. We know that the problem you have to solve in the code is current without being told. This comment applies to all patches.

Show 103 quoted lines
> Modify '-t' and '-s' options to call sha1_object_info_extended()
> directly to support the '--allow-unkown-type' option.
>
> Helped-by: Junio C Hamano <gitster@pobox.com>
> Helped-by: Eric Sunshine <sunshine@sunshineco.com>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
>  builtin/cat-file.c | 38 ++++++++++++++++++++++++++------------
>  1 file changed, 26 insertions(+), 12 deletions(-)
>
> diff --git a/builtin/cat-file.c b/builtin/cat-file.c
> index 53b5376..299e2e5 100644
> --- a/builtin/cat-file.c
> +++ b/builtin/cat-file.c
> @@ -9,13 +9,20 @@
>  #include "userdiff.h"
>  #include "streaming.h"
>  
> -static int cat_one_file(int opt, const char *exp_type, const char *obj_name)
> +static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
> +			int unkown_type)
>  {
>  	unsigned char sha1[20];
>  	enum object_type type;
>  	char *buf;
>  	unsigned long size;
>  	struct object_context obj_context;
> +	struct object_info oi = {NULL};
> +	struct strbuf sb = STRBUF_INIT;
> +	unsigned flags = LOOKUP_REPLACE_OBJECT;
> +
> +	if (unkown_type)
> +		flags |= LOOKUP_UNKNOWN_OBJECT;
>  
>  	if (get_sha1_with_context(obj_name, 0, sha1, &obj_context))
>  		die("Not a valid object name %s", obj_name);
> @@ -23,20 +30,22 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)
>  	buf = NULL;
>  	switch (opt) {
>  	case 't':
> -		type = sha1_object_info(sha1, NULL);
> -		if (type > 0) {
> -			printf("%s\n", typename(type));
> +		oi.typename = &sb;
> +		if (sha1_object_info_extended(sha1, &oi, flags) < 0)
> +			die("git cat-file: could not get object info");
> +		if (sb.len) {
> +			printf("%s\n", sb.buf);
> +			strbuf_release(&sb);
>  			return 0;
>  		}
>  		break;
>  
>  	case 's':
> -		type = sha1_object_info(sha1, &size);
> -		if (type > 0) {
> -			printf("%lu\n", size);
> -			return 0;
> -		}
> -		break;
> +		oi.sizep = &size;
> +		if (sha1_object_info_extended(sha1, &oi, flags) < 0)
> +			die("git cat-file: could not get object info");
> +		printf("%lu\n", size);
> +		return 0;
>  
>  	case 'e':
>  		return !has_sha1_file(sha1);
> @@ -323,7 +332,7 @@ static int batch_objects(struct batch_options *opt)
>  }
>  
>  static const char * const cat_file_usage[] = {
> -	N_("git cat-file (-t | -s | -e | -p | <type> | --textconv) <object>"),
> +	N_("git cat-file (-t [--allow-unkown-type]|-s [--allow-unkown-type]|-e|-p|<type>|--textconv) <object>"),
>  	N_("git cat-file (--batch | --batch-check) < <list-of-objects>"),
>  	NULL
>  };
> @@ -359,6 +368,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
>  	int opt = 0;
>  	const char *exp_type = NULL, *obj_name = NULL;
>  	struct batch_options batch = {0};
> +	int unkown_type = 0;
>  
>  	const struct option options[] = {
>  		OPT_GROUP(N_("<type> can be one of: blob, tree, commit, tag")),
> @@ -369,6 +379,8 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
>  		OPT_CMDMODE('p', NULL, &opt, N_("pretty-print object's content"), 'p'),
>  		OPT_CMDMODE(0, "textconv", &opt,
>  			    N_("for blob objects, run textconv on object's content"), 'c'),
> +		OPT_BOOL( 0, "allow-unkown-type", &unkown_type,
> +			  N_("allow -s and -t to work with broken/corrupt objects")),
>  		{ OPTION_CALLBACK, 0, "batch", &batch, "format",
>  			N_("show info and content of objects fed from the standard input"),
>  			PARSE_OPT_OPTARG, batch_option_callback },
> @@ -402,5 +414,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
>  	if (batch.enabled)
>  		return batch_objects(&batch);
>  
> -	return cat_one_file(opt, exp_type, obj_name);
> +	if (unkown_type && opt != 't' && opt != 's')
> +		die("git cat-file --allow-unkown-type: use with -s or -t");
> +	return cat_one_file(opt, exp_type, obj_name, unkown_type);
>  }
Previous: Karthik NayakNext: karthik nayak
Message 9 of 17 in “cat-file: teach cat-file a '--allow-unkown-type' option”
  1. 0/5 cat-file: teach cat-file a '--allow-unkown-type' optionkarthik nayak, Apr 29, 2015
  2. 1/5 sha1_file: support reading from a loose object of unknown typeKarthik Nayak, Apr 29, 2015
  3. Junio C HamanoApr 29, 2015
  4. karthik nayakApr 29, 2015
  5. Junio C HamanoApr 29, 2015
  6. karthik nayakApr 30, 2015
  7. 2/5 cat-file: make the options mutually exclusiveKarthik Nayak, Apr 29, 2015
  8. 3/5 cat-file: teach cat-file a '--allow-unknown-type' optionKarthik Nayak, Apr 29, 2015
  9. Junio C HamanoApr 29, 2015
  10. karthik nayakApr 29, 2015
  11. Phil HordApr 29, 2015
  12. karthik nayakApr 29, 2015
  13. Junio C HamanoApr 29, 2015
  14. 5/5 t1006: add tests for git cat-file --allow-unkown-typeKarthik Nayak, Apr 29, 2015
  15. Eric SunshineApr 29, 2015
  16. 4/5 cat-file: add documentation for '--allow-unkown-type' option.Karthik Nayak, Apr 29, 2015
  17. Eric SunshineApr 29, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.