Merge branch 'issue-4203'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
diff --git a/src/merge.c b/src/merge.c
index 068a23e..0bc3b12 100644
--- a/src/merge.c
+++ b/src/merge.c
@@ -3243,7 +3243,7 @@ int git_merge(
git_reference *our_ref = NULL;
git_checkout_options checkout_opts;
git_annotated_commit *our_head = NULL, *base = NULL;
- git_index *index = NULL;
+ git_index *repo_index = NULL, *index = NULL;
git_indexwriter indexwriter = GIT_INDEXWRITER_INIT;
unsigned int checkout_strategy;
int error = 0;
@@ -3266,6 +3266,10 @@ int git_merge(
&checkout_strategy)) < 0)
goto done;
+ if ((error = git_repository_index(&repo_index, repo) < 0) ||
+ (error = git_index_read(repo_index, 0) < 0))
+ goto done;
+
/* Write the merge setup files to the repository. */
if ((error = git_annotated_commit_from_head(&our_head, repo)) < 0 ||
(error = git_merge__setup(repo, our_head, their_heads,
@@ -3299,6 +3303,7 @@ done:
git_annotated_commit_free(our_head);
git_annotated_commit_free(base);
git_reference_free(our_ref);
+ git_index_free(repo_index);
return error;
}
diff --git a/tests/merge/workdir/simple.c b/tests/merge/workdir/simple.c
index cff1a57..a8d5d0b 100644
--- a/tests/merge/workdir/simple.c
+++ b/tests/merge/workdir/simple.c
@@ -168,6 +168,35 @@ void test_merge_workdir_simple__automerge(void)
git_index_free(index);
}
+void test_merge_workdir_simple__index_reload(void)
+{
+ git_repository *tmp_repo;
+ git_annotated_commit *their_heads[1];
+ git_oid their_oid;
+ git_index_entry entry = {{0}};
+ git_index *tmp_index;
+
+ cl_git_pass(git_repository_open(&tmp_repo, git_repository_workdir(repo)));
+ cl_git_pass(git_repository_index(&tmp_index, tmp_repo));
+ cl_git_pass(git_index_read(repo_index, 0));
+
+ entry.mode = GIT_FILEMODE_BLOB;
+ cl_git_pass(git_oid_fromstr(&entry.id, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2"));
+ entry.path = "automergeable.txt";
+ cl_git_pass(git_index_add(repo_index, &entry));
+
+ cl_git_pass(git_index_add_bypath(tmp_index, "automergeable.txt"));
+ cl_git_pass(git_index_write(tmp_index));
+
+ cl_git_pass(git_oid_fromstr(&their_oid, THEIRS_SIMPLE_OID));
+ cl_git_pass(git_annotated_commit_lookup(&their_heads[0], repo, &their_oid));
+ cl_git_pass(git_merge(repo, (const git_annotated_commit **)their_heads, 1, NULL, NULL));
+
+ git_index_free(tmp_index);
+ git_repository_free(tmp_repo);
+ git_annotated_commit_free(their_heads[0]);
+}
+
void test_merge_workdir_simple__automerge_crlf(void)
{
#ifdef GIT_WIN32