[PATCH 6/6] builtin/merge.c: Fix a bug with trivial merges
- From
Elijah Newren <newren@gmail.com>
- Date
- Apr 10, 2016, 06:13 UTC
- Message-ID
- <1460268820-8308-7-git-send-email-newren@gmail.com>
- In-Reply-To
- <1460268820-8308-1-git-send-email-newren@gmail.com>
If read_tree_trivial succeeds and produces a tree that is already in the object store, then the index is not written to disk, leaving it out-of-sync with both HEAD and the working tree.
In order to write the index back out to disk after a merge,
write_index_locked() needs to be called. For most merge strategies, this
is done from try_merge_strategy(). For fast forward updates, this is
done from checkout_fast_forward(). When trivial merges work, the call to
write_index_locked() is buried a little deeper:
merge_trivial()
-> write_tree_trivial()
-> write_cache_as_tree()
-> write_index_as_tree()
-> write_locked_index()
However, it is only called when !cache_tree_fully_valid(), which is how
this bug is triggered. But that also shows why this bug doesn't affect
any other merge strategies or cases.Add a direct call to write_index_locked() from merge_trivial() to fix this issue. Since the indirect call to write_locked_index() was conditional on cache_tree_fully_valid(), it won't be written twice.
Signed-off-by: Elijah Newren <newren@gmail.com> --- builtin/merge.c | 8 ++++++++ t/t7605-merge-resolve.sh | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/builtin/merge.c b/builtin/merge.c index 101ffef..8615343 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -819,6 +819,14 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads) { unsigned char result_tree[20], result_commit[20]; struct commit_list *parents, **pptr = &parents; + static struct lock_file lock; + + hold_locked_index(&lock, 1); + refresh_cache(REFRESH_QUIET); + if (active_cache_changed && + write_locked_index(&the_index, &lock, COMMIT_LOCK)) + return error(_("Unable to write index.")); + rollback_lock_file(&lock); write_tree_trivial(result_tree); printf(_("Wonderful.\n")); diff --git a/t/t7605-merge-resolve.sh b/t/t7605-merge-resolve.sh index 2f80037..5d56c38 100755 --- a/t/t7605-merge-resolve.sh +++ b/t/t7605-merge-resolve.sh @@ -43,7 +43,7 @@ merge_c1_to_c2_cmds=' test_expect_success 'merge c1 to c2' "$merge_c1_to_c2_cmds" -test_expect_failure 'merge c1 to c2, again' "$merge_c1_to_c2_cmds" +test_expect_success 'merge c1 to c2, again' "$merge_c1_to_c2_cmds" test_expect_success 'merge c2 to c3 (fails)' ' git reset --hard c2 &&
-- 2.8.0.21.g229f62a