DirCacheEditor: Apply PathEdit for each stage
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>
This commit is contained in:
parent
05a7113002
commit
a2e691351f
|
@ -44,6 +44,9 @@
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
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.dircache.DirCacheEditor.PathEdit;
|
||||||
import org.eclipse.jgit.lib.FileMode;
|
import org.eclipse.jgit.lib.FileMode;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
|
@ -66,6 +69,19 @@ public void apply(DirCacheEntry ent) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
@Test
|
||||||
public void testAddDeletePathAndTreeNormalNames() {
|
public void testAddDeletePathAndTreeNormalNames() {
|
||||||
DirCache dc = DirCache.newInCore();
|
DirCache dc = DirCache.newInCore();
|
||||||
|
@ -114,4 +130,31 @@ public void testAddDeleteTrickyNames() {
|
||||||
assertEquals("a.", dc.getEntry(0).getPathString());
|
assertEquals("a.", dc.getEntry(0).getPathString());
|
||||||
assertEquals("ab", dc.getEntry(1).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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,18 +146,21 @@ private void applyEdits() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final DirCacheEntry ent;
|
|
||||||
if (missing) {
|
if (missing) {
|
||||||
ent = new DirCacheEntry(e.path);
|
final DirCacheEntry ent = new DirCacheEntry(e.path);
|
||||||
e.apply(ent);
|
e.apply(ent);
|
||||||
if (ent.getRawMode() == 0)
|
if (ent.getRawMode() == 0)
|
||||||
throw new IllegalArgumentException(MessageFormat.format(JGitText.get().fileModeNotSetForPath
|
throw new IllegalArgumentException(MessageFormat.format(JGitText.get().fileModeNotSetForPath
|
||||||
, ent.getPathString()));
|
, ent.getPathString()));
|
||||||
} else {
|
|
||||||
ent = cache.getEntry(eIdx);
|
|
||||||
e.apply(ent);
|
|
||||||
}
|
|
||||||
fastAdd(ent);
|
fastAdd(ent);
|
||||||
|
} else {
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final int cnt = maxIdx - lastIdx;
|
final int cnt = maxIdx - lastIdx;
|
||||||
|
|
Loading…
Reference in New Issue