]> source.dussan.org Git - jgit.git/commitdiff
DirCacheEditor: Apply PathEdit for each stage 82/7882/5
authorRobin Stocker <robin@nibor.org>
Sat, 22 Sep 2012 23:37:09 +0000 (01:37 +0200)
committerChris Aniszczyk <zx@twitter.com>
Fri, 16 Nov 2012 18:12:40 +0000 (10:12 -0800)
This behavior was defined in the Javadoc of PathEdit, but not actually
implemented.

It's necessary when one wants to use a PathEdit to check out a specific
stage in apply.

Bug: 390147
Change-Id: Iaed5cf60c554fc17e6c4d188caf4f0231da920d0
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCachePathEditTest.java
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java

index 4a6a42b6d2478d1ff2f6b255c4207f63369b408d..28140f330ec378e36d1f90955576c84355a16f51 100644 (file)
@@ -44,6 +44,9 @@ package org.eclipse.jgit.dircache;
 
 import static org.junit.Assert.assertEquals;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
@@ -66,6 +69,19 @@ public class DirCachePathEditTest {
 
        }
 
+       private static final class RecordingEdit extends PathEdit {
+               final List<DirCacheEntry> entries = new ArrayList<DirCacheEntry>();
+
+               public RecordingEdit(String entryPath) {
+                       super(entryPath);
+               }
+
+               @Override
+               public void apply(DirCacheEntry ent) {
+                       entries.add(ent);
+               }
+       }
+
        @Test
        public void testAddDeletePathAndTreeNormalNames() {
                DirCache dc = DirCache.newInCore();
@@ -114,4 +130,31 @@ public class DirCachePathEditTest {
                assertEquals("a.", dc.getEntry(0).getPathString());
                assertEquals("ab", dc.getEntry(1).getPathString());
        }
+
+       @Test
+       public void testPathEditShouldBeCalledForEachStage() throws Exception {
+               DirCache dc = DirCache.newInCore();
+               DirCacheBuilder builder = new DirCacheBuilder(dc, 3);
+               builder.add(createEntry("a", DirCacheEntry.STAGE_1));
+               builder.add(createEntry("a", DirCacheEntry.STAGE_2));
+               builder.add(createEntry("a", DirCacheEntry.STAGE_3));
+               builder.finish();
+
+               DirCacheEditor editor = dc.editor();
+               RecordingEdit recorder = new RecordingEdit("a");
+               editor.add(recorder);
+               editor.finish();
+
+               List<DirCacheEntry> entries = recorder.entries;
+               assertEquals(3, entries.size());
+               assertEquals(DirCacheEntry.STAGE_1, entries.get(0).getStage());
+               assertEquals(DirCacheEntry.STAGE_2, entries.get(1).getStage());
+               assertEquals(DirCacheEntry.STAGE_3, entries.get(2).getStage());
+       }
+
+       private static DirCacheEntry createEntry(String path, int stage) {
+               DirCacheEntry entry = new DirCacheEntry(path, stage);
+               entry.setFileMode(FileMode.REGULAR_FILE);
+               return entry;
+       }
 }
index 6c12c402b63170ec212038d8c8044a632d02492f..b0cb34c352f1cc7997cf5abae9109512844da812 100644 (file)
@@ -146,18 +146,21 @@ public class DirCacheEditor extends BaseDirCacheEditor {
                                continue;
                        }
 
-                       final DirCacheEntry ent;
                        if (missing) {
-                               ent = new DirCacheEntry(e.path);
+                               final DirCacheEntry ent = new DirCacheEntry(e.path);
                                e.apply(ent);
                                if (ent.getRawMode() == 0)
                                        throw new IllegalArgumentException(MessageFormat.format(JGitText.get().fileModeNotSetForPath
                                                        , ent.getPathString()));
+                               fastAdd(ent);
                        } else {
-                               ent = cache.getEntry(eIdx);
-                               e.apply(ent);
+                               // Apply to all entries of the current path (different stages)
+                               for (int i = eIdx; i < lastIdx; i++) {
+                                       final DirCacheEntry ent = cache.getEntry(i);
+                                       e.apply(ent);
+                                       fastAdd(ent);
+                               }
                        }
-                       fastAdd(ent);
                }
 
                final int cnt = maxIdx - lastIdx;