Fix bug regarding handling of non-versioned files during merge
There was a bug introduced by commit 0e815fe
. For non-versioned files
the merge algorithm detected an incoming deletion from THEIRS.
Consequently such files were deleted. That's a severe bug which was
fixed by more precisely detecting incoming deletions.
Change-Id: I4385d3c990db11d62e371a385dc8ee89841db84a
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
Signed-off-by: Philipp Thun <philipp.thun@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
parent
bd98a0a9a5
commit
5adef23365
|
@ -197,6 +197,56 @@ public void testContentMerge() throws Exception {
|
||||||
assertEquals(RepositoryState.MERGING, db.getRepositoryState());
|
assertEquals(RepositoryState.MERGING, db.getRepositoryState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMergeNonVersionedPaths() throws Exception {
|
||||||
|
Git git = new Git(db);
|
||||||
|
|
||||||
|
writeTrashFile("a", "1\na\n3\n");
|
||||||
|
writeTrashFile("b", "1\nb\n3\n");
|
||||||
|
writeTrashFile("c/c/c", "1\nc\n3\n");
|
||||||
|
git.add().addFilepattern("a").addFilepattern("b")
|
||||||
|
.addFilepattern("c/c/c").call();
|
||||||
|
RevCommit initialCommit = git.commit().setMessage("initial").call();
|
||||||
|
|
||||||
|
createBranch(initialCommit, "refs/heads/side");
|
||||||
|
checkoutBranch("refs/heads/side");
|
||||||
|
|
||||||
|
writeTrashFile("a", "1\na(side)\n3\n");
|
||||||
|
writeTrashFile("b", "1\nb(side)\n3\n");
|
||||||
|
git.add().addFilepattern("a").addFilepattern("b").call();
|
||||||
|
RevCommit secondCommit = git.commit().setMessage("side").call();
|
||||||
|
|
||||||
|
assertEquals("1\nb(side)\n3\n", read(new File(db.getWorkTree(), "b")));
|
||||||
|
checkoutBranch("refs/heads/master");
|
||||||
|
assertEquals("1\nb\n3\n", read(new File(db.getWorkTree(), "b")));
|
||||||
|
|
||||||
|
writeTrashFile("a", "1\na(main)\n3\n");
|
||||||
|
writeTrashFile("c/c/c", "1\nc(main)\n3\n");
|
||||||
|
git.add().addFilepattern("a").addFilepattern("c/c/c").call();
|
||||||
|
git.commit().setMessage("main").call();
|
||||||
|
|
||||||
|
writeTrashFile("d", "1\nd\n3\n");
|
||||||
|
assertTrue(new File(db.getWorkTree(), "e").mkdir());
|
||||||
|
|
||||||
|
MergeResult result = git.merge().include(secondCommit.getId())
|
||||||
|
.setStrategy(MergeStrategy.RESOLVE).call();
|
||||||
|
assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus());
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
"1\n<<<<<<< HEAD\na(main)\n=======\na(side)\n>>>>>>> 86503e7e397465588cc267b65d778538bffccb83\n3\n",
|
||||||
|
read(new File(db.getWorkTree(), "a")));
|
||||||
|
assertEquals("1\nb(side)\n3\n", read(new File(db.getWorkTree(), "b")));
|
||||||
|
assertEquals("1\nc(main)\n3\n",
|
||||||
|
read(new File(db.getWorkTree(), "c/c/c")));
|
||||||
|
assertEquals("1\nd\n3\n", read(new File(db.getWorkTree(), "d")));
|
||||||
|
File dir = new File(db.getWorkTree(), "e");
|
||||||
|
assertTrue(dir.isDirectory());
|
||||||
|
|
||||||
|
assertEquals(1, result.getConflicts().size());
|
||||||
|
assertEquals(3, result.getConflicts().get("a")[0].length);
|
||||||
|
|
||||||
|
assertEquals(RepositoryState.MERGING, db.getRepositoryState());
|
||||||
|
}
|
||||||
|
|
||||||
public void testSuccessfulContentMerge() throws Exception {
|
public void testSuccessfulContentMerge() throws Exception {
|
||||||
Git git = new Git(db);
|
Git git = new Git(db);
|
||||||
|
|
||||||
|
|
|
@ -390,7 +390,7 @@ private boolean processEntry(CanonicalTreeParser base,
|
||||||
if (e != null)
|
if (e != null)
|
||||||
toBeCheckedOut.put(tw.getPathString(), e);
|
toBeCheckedOut.put(tw.getPathString(), e);
|
||||||
return true;
|
return true;
|
||||||
} else if (modeT == 0) {
|
} else if ((modeT == 0) && (modeB != 0)) {
|
||||||
// we want THEIRS ... but THEIRS contains the deletion of the
|
// we want THEIRS ... but THEIRS contains the deletion of the
|
||||||
// file
|
// file
|
||||||
toBeCheckedOut.put(tw.getPathString(), null);
|
toBeCheckedOut.put(tw.getPathString(), null);
|
||||||
|
|
Loading…
Reference in New Issue