diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java index 80c779ddf..77f123854 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java @@ -176,15 +176,90 @@ public void testConflicting() throws Exception { IndexDiff diff = new IndexDiff(db, Constants.HEAD, iterator); diff.diff(); - assertEquals("[a, b]", + assertEquals("[b]", new TreeSet(diff.getChanged()).toString()); - assertEquals("[a]", diff.getAdded().toString()); + assertEquals("[]", diff.getAdded().toString()); assertEquals("[]", diff.getRemoved().toString()); - assertEquals("[a]", diff.getMissing().toString()); - assertEquals("[a]", diff.getModified().toString()); + assertEquals("[]", diff.getMissing().toString()); + assertEquals("[]", diff.getModified().toString()); assertEquals("[a]", diff.getConflicting().toString()); } + @Test + public void testConflictingDeletedAndModified() throws Exception { + Git git = new Git(db); + + writeTrashFile("a", "1\na\n3\n"); + writeTrashFile("b", "1\nb\n3\n"); + git.add().addFilepattern("a").addFilepattern("b").call(); + RevCommit initialCommit = git.commit().setMessage("initial").call(); + + // create side branch and delete "a" + createBranch(initialCommit, "refs/heads/side"); + checkoutBranch("refs/heads/side"); + git.rm().addFilepattern("a").call(); + RevCommit secondCommit = git.commit().setMessage("side").call(); + + // update a on master to generate conflict + checkoutBranch("refs/heads/master"); + writeTrashFile("a", "1\na(main)\n3\n"); + git.add().addFilepattern("a").call(); + git.commit().setMessage("main").call(); + + // merge side with master + MergeResult result = git.merge().include(secondCommit.getId()) + .setStrategy(MergeStrategy.RESOLVE).call(); + assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus()); + + FileTreeIterator iterator = new FileTreeIterator(db); + IndexDiff diff = new IndexDiff(db, Constants.HEAD, iterator); + diff.diff(); + + assertEquals("[]", new TreeSet(diff.getChanged()).toString()); + assertEquals("[]", diff.getAdded().toString()); + assertEquals("[]", diff.getRemoved().toString()); + assertEquals("[]", diff.getMissing().toString()); + assertEquals("[]", diff.getModified().toString()); + assertEquals("[a]", diff.getConflicting().toString()); + } + + @Test + public void testConflictingFromMultipleCreations() throws Exception { + Git git = new Git(db); + + writeTrashFile("a", "1\na\n3\n"); + git.add().addFilepattern("a").call(); + RevCommit initialCommit = git.commit().setMessage("initial").call(); + + createBranch(initialCommit, "refs/heads/side"); + checkoutBranch("refs/heads/side"); + + writeTrashFile("b", "1\nb(side)\n3\n"); + git.add().addFilepattern("b").call(); + RevCommit secondCommit = git.commit().setMessage("side").call(); + + checkoutBranch("refs/heads/master"); + + writeTrashFile("b", "1\nb(main)\n3\n"); + git.add().addFilepattern("b").call(); + git.commit().setMessage("main").call(); + + MergeResult result = git.merge().include(secondCommit.getId()) + .setStrategy(MergeStrategy.RESOLVE).call(); + assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus()); + + FileTreeIterator iterator = new FileTreeIterator(db); + IndexDiff diff = new IndexDiff(db, Constants.HEAD, iterator); + diff.diff(); + + assertEquals("[]", new TreeSet(diff.getChanged()).toString()); + assertEquals("[]", diff.getAdded().toString()); + assertEquals("[]", diff.getRemoved().toString()); + assertEquals("[]", diff.getMissing().toString()); + assertEquals("[]", diff.getModified().toString()); + assertEquals("[b]", diff.getConflicting().toString()); + } + @Test public void testUnchangedSimple() throws IOException { GitIndex index = new GitIndex(db); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java index b2c05ae5f..0b23b23bd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java @@ -286,6 +286,15 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize, WorkingTreeIterator workingTreeIterator = treeWalk.getTree(WORKDIR, WorkingTreeIterator.class); + if (dirCacheIterator != null) { + final DirCacheEntry dirCacheEntry = dirCacheIterator + .getDirCacheEntry(); + if (dirCacheEntry != null && dirCacheEntry.getStage() > 0) { + conflicts.add(treeWalk.getPathString()); + continue; + } + } + if (treeIterator != null) { if (dirCacheIterator != null) { if (!treeIterator.idEqual(dirCacheIterator) @@ -324,12 +333,6 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize, modified.add(treeWalk.getPathString()); } } - - final DirCacheEntry dirCacheEntry = dirCacheIterator - .getDirCacheEntry(); - if (dirCacheEntry != null && dirCacheEntry.getStage() > 0) { - conflicts.add(treeWalk.getPathString()); - } } }