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;