Denton Liu <liu.denton@xxxxxxxxx> writes: > 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. > 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. > 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? > + } 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/"); > +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.