diff options
author | Denton Liu <liu.denton@gmail.com> | 2020-09-20 04:22:25 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-09-20 21:30:26 -0700 |
commit | 0f5a1d449b9538c2765de9d6683abbb83a7fb4e2 (patch) | |
tree | 29cbd67c4138aed23542fb1030c3c718bba6ae9e /diff-lib.c | |
parent | t4068: add --merge-base tests (diff) | |
download | tgif-0f5a1d449b9538c2765de9d6683abbb83a7fb4e2.tar.xz |
builtin/diff-index: learn --merge-base
There is currently no easy way to take the diff between the working tree
or index and the merge base between an arbitrary commit and HEAD. Even
diff's `...` notation doesn't allow this because it only works between
commits. However, the ability to do this would be desirable to a user
who would like to see all the changes they've made on a branch plus
uncommitted changes without taking into account changes made in the
upstream branch.
Teach diff-index and diff (with one commit) the --merge-base option
which allows a user to use the merge base of a commit and HEAD as the
"before" side.
Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diff-lib.c')
-rw-r--r-- | diff-lib.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/diff-lib.c b/diff-lib.c index 468e3fe854..c578560997 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -561,13 +561,26 @@ int run_diff_index(struct rev_info *revs, unsigned int option) { struct object_array_entry *ent; int cached = !!(option & DIFF_INDEX_CACHED); + int merge_base = !!(option & DIFF_INDEX_MERGE_BASE); + struct object_id oid; + const char *name; + char merge_base_hex[GIT_MAX_HEXSZ + 1]; 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, cached)) + + if (merge_base) { + diff_get_merge_base(revs, &oid); + name = oid_to_hex_r(merge_base_hex, &oid); + } else { + oidcpy(&oid, &ent->item->oid); + name = ent->name; + } + + if (diff_cache(revs, &oid, name, cached)) exit(128); diff_set_mnemonic_prefix(&revs->diffopt, "c/", cached ? "i/" : "w/"); |