On Fri, Feb 14, 2020 at 01:22:20PM -0500, Jeff King wrote: > The current behavior from "rev-list --count --objects" is nonsensical: > we enumerate all of the objects except commits, but then give a count of > commits. This wasn't planned, and is just what the code happens to do. > > Instead, let's give the answer the user almost certainly wanted: the > full count of objects. This makes sense: I've often worried about introducing backwards-incompatible changes in newer versions of Git, even for behavior that didn't make sense to begin with. Of course, backwards-incompatible changes *are* something worth worrying about, but I don't find that the behavior was sensible to begin with, so I don't have a problem "breaking" it if "breaking" means making something nonsensical behave correctly. > Note that there are more complicated cases around cherry-marking, etc. > We'll punt on those for now, but let the user know that we can't produce > an answer (rather than giving them something useless). Yep, sounds good. > We'll test both the new feature as well as a vanilla --count of commits, > since that surprisingly doesn't seem to be covered in the existing > tests. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > builtin/rev-list.c | 13 +++++++++++++ > t/t6000-rev-list-misc.sh | 12 ++++++++++++ > 2 files changed, 25 insertions(+) > > diff --git a/builtin/rev-list.c b/builtin/rev-list.c > index 38c5ca5603..9452123988 100644 > --- a/builtin/rev-list.c > +++ b/builtin/rev-list.c > @@ -253,11 +253,19 @@ static int finish_object(struct object *obj, const char *name, void *cb_data) > static void show_object(struct object *obj, const char *name, void *cb_data) > { > struct rev_list_info *info = cb_data; > + struct rev_info *revs = info->revs; > + > if (finish_object(obj, name, cb_data)) > return; > display_progress(progress, ++progress_counter); > if (info->flags & REV_LIST_QUIET) > return; > + > + if (revs->count) { > + revs->count_right++; > + return; > + } > + Hmm. This puzzled me at first. Do you think that it could benefit from a comment? > if (arg_show_object_names) > show_object_with_name(stdout, obj, name); > else > @@ -584,6 +592,11 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) > if (revs.show_notes) > die(_("rev-list does not support display of notes")); > > + if (revs.count && > + (revs.tag_objects || revs.tree_objects || revs.blob_objects) && > + (revs.left_right || revs.cherry_mark)) > + die(_("marked counting is incompatible with --objects")); > + > if (filter_options.choice) > use_bitmap_index = 0; > > diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh > index b8cf82349b..383f2c457d 100755 > --- a/t/t6000-rev-list-misc.sh > +++ b/t/t6000-rev-list-misc.sh > @@ -148,4 +148,16 @@ test_expect_success 'rev-list --end-of-options' ' > test_cmp expect actual > ' > > +test_expect_success 'rev-list --count' ' > + count=$(git rev-list --count HEAD) && > + git rev-list HEAD >actual && > + test_line_count = $count actual > +' > + > +test_expect_success 'rev-list --count --objects' ' > + count=$(git rev-list --count --objects HEAD) && > + git rev-list --objects HEAD >actual && > + test_line_count = $count actual > +' > + > test_done > -- > 2.25.0.796.gcc29325708 All looks good. Thanks, Taylor