Re: [PATCH v3 08/10] builtin/diff-index: learn --merge-base
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 17, 2020, 17:28 UTC
- Message-ID
- <xmqq8sd8s46i.fsf@gitster.c.googlers.com>
- In-Reply-To
- <1e4f805e570b8caad26c43b4c8293413e9128d5f.1600328335.git.liu.denton@gmail.com>
Denton Liu <liu.denton@gmail.com> writes:
Show 26 quoted lines
> diff --git a/builtin/diff-index.c b/builtin/diff-index.c > index c3878f7ad6..7f5281c461 100644 > --- a/builtin/diff-index.c > +++ b/builtin/diff-index.c > @@ -33,6 +33,8 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix) > > if (!strcmp(arg, "--cached")) > option |= DIFF_INDEX_CACHED; > + else if (!strcmp(arg, "--merge-base")) > + option |= DIFF_INDEX_MERGE_BASE; > else > usage(diff_cache_usage); > } > diff --git a/builtin/diff.c b/builtin/diff.c > index e45e19e37e..1baea18ae0 100644 > --- a/builtin/diff.c > +++ b/builtin/diff.c > @@ -139,6 +139,8 @@ static int builtin_diff_index(struct rev_info *revs, > const char *arg = argv[1]; > if (!strcmp(arg, "--cached") || !strcmp(arg, "--staged")) > option |= DIFF_INDEX_CACHED; > + else if (!strcmp(arg, "--merge-base")) > + option |= DIFF_INDEX_MERGE_BASE; > else > usage(builtin_diff_usage); > argv++; argc--;
OK.
Show 10 quoted lines
> diff --git a/diff-lib.c b/diff-lib.c
> index e01c3f0612..68bf86f289 100644
> --- a/diff-lib.c
> +++ b/diff-lib.c
> @@ -569,13 +569,24 @@ void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb)
> int run_diff_index(struct rev_info *revs, unsigned int option)
> {
> struct object_array_entry *ent;
> + struct object_id oid;
> + const char *name;Let's do the same
int compare_with_merge_base = !!(option & DIFF_INDEX_MERGE_BASE);
here to keep the result easier to follow.
Show 10 quoted lines
> if (revs->pending.nr != 1)
> BUG("run_diff_index must be passed exactly one tree");
>
> trace_performance_enter();
> ent = revs->pending.objects;
> - if (diff_cache(revs, &ent->item->oid, ent->name, !!(option & DIFF_INDEX_CACHED)))
> +
> + if (option & DIFF_INDEX_MERGE_BASE) {
> + diff_get_merge_base(revs, &oid);
> + name = xstrdup(oid_to_hex(&oid));Leak?
Show 9 quoted lines
> + } else {
> + oidcpy(&oid, &ent->item->oid);
> + name = ent->name;
> + }
> +
> + if (diff_cache(revs, &oid, name, !!(option & DIFF_INDEX_CACHED)))
> exit(128);
>
> diff_set_mnemonic_prefix(&revs->diffopt, "c/", (option & DIFF_INDEX_CACHED) ? "i/" : "w/");Show 8 quoted lines
> +for cmd in diff-index diff > +do > + test_expect_success "$cmd --merge-base with one commit" ' > + git checkout master && > + git $cmd commit-C >expect && > + git $cmd --merge-base br2 >actual && > + test_cmp expect actual > + '
OK, the same command, when comparing with commit-C and with "--merge-base br2" that should compute the same commit-C, should give the same answer. Good testing strategy.
Thanks.