Re: [PATCH] cat-file: handle content request for --batch-command without type

Junio C Hamano <[email protected]> Tue, 28 Jul 2026 10:36:57 -0700
Newsgroups org.kernel.vger.git
Message-ID <[email protected]>
Jeff King <[email protected]> writes:

> We can fix it by tweaking the object_info on the fly as we receive each
> command. But we should be careful to restore it afterwards; otherwise a
> sequence of commands like:
>
>   contents $one
>   info $two
>   info $three
>
> will pay the type-lookup price for $two and $three when it does not need
> to. This wouldn't be incorrect, but just slightly inefficient (and hence
> there are no tests for that part, because the externally-visible
> behavior is the same).

Woooo, tricky.  I love this kind of attention to details.

The patch text obviously is correct.

Will queue and mark the topic for 'next'.  Thanks.


> Reported-by: Alan Stokes <[email protected]>
> Helped-by: Pablo Sabater <[email protected]>
> Signed-off-by: Jeff King <[email protected]>
> ---
>  builtin/cat-file.c  | 3 +++
>  t/t1006-cat-file.sh | 8 ++++++++
>  2 files changed, 11 insertions(+)
>
> diff --git a/builtin/cat-file.c b/builtin/cat-file.c
> index 1458dd76d6..ac458c9737 100644
> --- a/builtin/cat-file.c
> +++ b/builtin/cat-file.c
> @@ -689,8 +689,11 @@ static void parse_cmd_contents(struct batch_options *opt,
>  			     struct strbuf *output,
>  			     struct expand_data *data)
>  {
> +	enum object_type *saved_typep = data->info.typep;
> +	data->info.typep = &data->type;
>  	opt->batch_mode = BATCH_MODE_CONTENTS;
>  	batch_one_object(line, output, opt, data);
> +	data->info.typep = saved_typep;
>  }
>  
>  static void parse_cmd_info(struct batch_options *opt,
> diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
> index 762c77c351..f085738082 100755
> --- a/t/t1006-cat-file.sh
> +++ b/t/t1006-cat-file.sh
> @@ -1351,6 +1351,14 @@ test_expect_success 'batch-command flush without --buffer' '
>  	test_grep "^fatal:.*flush is only for --buffer mode.*" err
>  '
>  
> +test_expect_success 'batch-command contents auto-handles type' '
> +	echo "HEAD" |
> +		git cat-file --batch="%(objectname)" >expect &&
> +	echo "contents HEAD" |
> +		git cat-file --batch-command="%(objectname)" >actual &&
> +	test_cmp expect actual
> +'
> +
>  perl_script='
>  use warnings;
>  use strict;