aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RacyGitTests.java25
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java44
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java9
3 files changed, 55 insertions, 23 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RacyGitTests.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RacyGitTests.java
index e208b27e6b..89ad252019 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RacyGitTests.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RacyGitTests.java
@@ -43,13 +43,10 @@
package org.eclipse.jgit.lib;
import java.io.File;
-import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.TreeSet;
-import org.eclipse.jgit.dircache.DirCacheBuilder;
-import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.FileTreeIteratorWithTimeControl;
import org.eclipse.jgit.treewalk.NameConflictTreeWalk;
@@ -133,7 +130,7 @@ public class RacyGitTests extends RepositoryTestCase {
modTimes.add(fsTick(lastFile));
// now add both files to the index. No racy git expected
- addToIndex(modTimes);
+ resetIndex(new FileTreeIteratorWithTimeControl(db, modTimes));
assertEquals(
"[a, mode:100644, time:t0, length:1, sha1:2e65efe2a145dda7ee51d1741299f848e5bf752e]" +
@@ -150,7 +147,7 @@ public class RacyGitTests extends RepositoryTestCase {
// now update the index the index. 'a' has to be racily clean -- because
// it's modification time is exactly the same as the previous index file
// mod time.
- addToIndex(modTimes);
+ resetIndex(new FileTreeIteratorWithTimeControl(db, modTimes));
db.readDirCache();
// although racily clean a should not be reported as being dirty
@@ -160,24 +157,6 @@ public class RacyGitTests extends RepositoryTestCase {
indexState(SMUDGE|MOD_TIME|LENGTH));
}
- private void addToIndex(TreeSet<Long> modTimes)
- throws FileNotFoundException, IOException {
- DirCacheBuilder builder = db.lockDirCache().builder();
- FileTreeIterator fIt = new FileTreeIteratorWithTimeControl(
- db, modTimes);
- DirCacheEntry dce;
- while (!fIt.eof()) {
- dce = new DirCacheEntry(fIt.getEntryPathString());
- dce.setFileMode(fIt.getEntryFileMode());
- dce.setLastModified(fIt.getEntryLastModified());
- dce.setLength((int) fIt.getEntryLength());
- dce.setObjectId(fIt.getEntryObjectId());
- builder.add(dce);
- fIt.next(1);
- }
- builder.commit();
- }
-
private File addToWorkDir(String path, String content) throws IOException {
File f = new File(db.getWorkTree(), path);
FileOutputStream fos = new FileOutputStream(f);
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
index 963c9d039d..a98350c8d6 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
@@ -48,6 +48,7 @@ package org.eclipse.jgit.lib;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
@@ -56,9 +57,12 @@ import java.util.Map;
import java.util.TreeSet;
import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheBuilder;
+import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.dircache.DirCacheIterator;
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.storage.file.FileRepository;
+import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.NameConflictTreeWalk;
/**
@@ -203,6 +207,46 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
}
/**
+ * Resets the index to represent exactly some filesystem content. E.g. the
+ * following call will replace the index with the working tree content:
+ * <p>
+ * <code>resetIndex(new FileSystemIterator(db))</code>
+ * <p>
+ * This method can be used by testcases which first prepare a new commit
+ * somewhere in the filesystem (e.g. in the working-tree) and then want to
+ * have an index which matches their prepared content.
+ *
+ * @param treeItr
+ * a {@link FileTreeIterator} which determines which files should
+ * go into the new index
+ * @throws FileNotFoundException
+ * @throws IOException
+ */
+ protected void resetIndex(FileTreeIterator treeItr)
+ throws FileNotFoundException, IOException {
+ ObjectInserter inserter = db.newObjectInserter();
+ DirCacheBuilder builder = db.lockDirCache().builder();
+ DirCacheEntry dce;
+
+ while (!treeItr.eof()) {
+ long len = treeItr.getEntryLength();
+
+ dce = new DirCacheEntry(treeItr.getEntryPathString());
+ dce.setFileMode(treeItr.getEntryFileMode());
+ dce.setLastModified(treeItr.getEntryLastModified());
+ dce.setLength((int) len);
+ FileInputStream in = new FileInputStream(treeItr.getEntryFile());
+ dce.setObjectId(inserter.insert(Constants.OBJ_BLOB, len, in));
+ in.close();
+ builder.add(dce);
+ treeItr.next(1);
+ }
+ builder.commit();
+ inserter.flush();
+ inserter.release();
+ }
+
+ /**
* Helper method to map arbitrary objects to user-defined names. This can be
* used create short names for objects to produce small and stable debug
* output. It is guaranteed that when you lookup the same object multiple
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
index 2d032ab835..09dd50063f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/FileTreeIterator.java
@@ -211,4 +211,13 @@ public class FileTreeIterator extends WorkingTreeIterator {
public File getDirectory() {
return directory;
}
+
+ /**
+ * @return The location of the working file. This is the same as {@code new
+ * File(getDirectory(), getEntryPath())} but may be faster by
+ * reusing an internal File instance.
+ */
+ public File getEntryFile() {
+ return ((FileEntry) current()).getFile();
+ }
}