Re: [PATCH v2 06/15] rev-list: make --count work with --objects
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Feb 15, 2020, 00:42 UTC
- Message-ID
- <20200215004216.GA15192@syl.local>
- In-Reply-To
- <20200214182220.GF150965@coredump.intra.peff.net>
On Fri, Feb 14, 2020 at 01:22:20PM -0500, Jeff King wrote:
Show 6 quoted lines
> 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.
Show 31 quoted lines
> 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@peff.net>
> ---
> 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?
Show 38 quoted lines
> 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.gcc29325708All looks good.
Thanks, Taylor