]> source.dussan.org Git - jgit.git/commitdiff
IndexDiffFilter should never filter entries with stage!=0 58/30858/2
authorChristian Halstrick <christian.halstrick@sap.com>
Fri, 1 Aug 2014 09:28:01 +0000 (11:28 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Sat, 2 Aug 2014 21:04:26 +0000 (23:04 +0200)
If the IndexDiffFilter is asked whether it should include or filter out
a certain path and for that path there is a dircache entry with a stage
different from 0, then the filter should never filter out this entry.
IndexDiffFilter is an optimized version of AnyDiffFilter and there is no
case where the index contains non-0 stages but we still don't see any
diff for that path.

Change-Id: I25915880f304090fe90584c79bddf021231227a2
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/IndexDiffFilterTest.java
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java

index c95274f68ffa40bb853b2865931897ca540027a0..bb4b066bf8c61d3b3ccb63483e2c7398960fe15b 100644 (file)
@@ -134,6 +134,31 @@ public class IndexDiffFilterTest extends RepositoryTestCase {
                assertFalse(treeWalk.next());
        }
 
+       @Test
+       public void testConflicts() throws Exception {
+               RevCommit initial = git.commit().setMessage("initial").call();
+               writeTrashFile(FILE, "master");
+               git.add().addFilepattern(FILE).call();
+               RevCommit master = git.commit().setMessage("master").call();
+               git.checkout().setName("refs/heads/side")
+                               .setCreateBranch(true).setStartPoint(initial).call();
+               writeTrashFile(FILE, "side");
+               git.add().addFilepattern(FILE).call();
+               RevCommit side = git.commit().setMessage("side").call();
+               assertFalse(git.merge().include("master", master).call()
+                               .getMergeStatus()
+                               .isSuccessful());
+               assertEquals(read(FILE),
+                               "<<<<<<< HEAD\nside\n=======\nmaster\n>>>>>>> master\n");
+               writeTrashFile(FILE, "master");
+
+               TreeWalk treeWalk = createTreeWalk(side);
+               int count = 0;
+               while (treeWalk.next())
+                       count++;
+               assertEquals(2, count);
+       }
+
        @Test
        public void testFileInFolderCommitted() throws Exception {
                RevCommit commit = writeFileInFolderAndCommit();
index 79cd2193f6d6771e4a1e71dbb79c7cd6a4013509..5aab24caf5eef72710ed66128793088ec0588c53 100644 (file)
@@ -139,9 +139,13 @@ public class IndexDiffFilter extends TreeFilter {
                DirCacheIterator di = tw.getTree(dirCache, DirCacheIterator.class);
                if (di != null) {
                        DirCacheEntry dce = di.getDirCacheEntry();
-                       if (dce != null)
+                       if (dce != null) {
                                if (dce.isAssumeValid())
                                        return false;
+                               // Never filter index entries with a stage different from 0
+                               if (dce.getStage() != 0)
+                                       return true;
+                       }
                }
 
                if (!tw.isPostOrderTraversal()) {