From e1f8694f3394caf3d3cd57c6c7593f0b0cdb1f9e Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Sat, 30 Jun 2018 18:25:00 -0700 Subject: merge-recursive: fix assumption that head tree being merged is HEAD `git merge-recursive` does a three-way merge between user-specified trees base, head, and remote. Since the user is allowed to specify head, we can not necesarily assume that head == HEAD. Modify index_has_changes() to take an extra argument specifying the tree to compare against. If NULL, it will compare to HEAD. We then use this from merge-recursive to make sure we compare to the user-specified head. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- read-cache.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'read-cache.c') diff --git a/read-cache.c b/read-cache.c index f333a517f7..639c1fffa0 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1986,22 +1986,26 @@ int unmerged_index(const struct index_state *istate) return 0; } -int index_has_changes(const struct index_state *istate, struct strbuf *sb) +int index_has_changes(const struct index_state *istate, + struct tree *tree, + struct strbuf *sb) { - struct object_id head; + struct object_id cmp; int i; if (istate != &the_index) { BUG("index_has_changes cannot yet accept istate != &the_index; do_diff_cache needs updating first."); } - if (!get_oid_tree("HEAD", &head)) { + if (tree) + cmp = tree->object.oid; + if (tree || !get_oid_tree("HEAD", &cmp)) { struct diff_options opt; diff_setup(&opt); opt.flags.exit_with_status = 1; if (!sb) opt.flags.quick = 1; - do_diff_cache(&head, &opt); + do_diff_cache(&cmp, &opt); diffcore_std(&opt); for (i = 0; sb && i < diff_queued_diff.nr; i++) { if (i) -- cgit v1.2.3