Added a utility method to set the reset an index to match exactly some content in the filesystem. This can be used by tests to prepare commits in the working-tree and set the index in one shot. [sp: Cleaned up formatting, added getEntryFile(), released inserter.] Change-Id: If38b1f7cacaaf769f51b14541c5da0c1e24568a5 Signed-off-by: Christian Halstrick <christian.halstrick@sap.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>tags/v0.9.1
@@ -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); |
@@ -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; | |||
/** | |||
@@ -202,6 +206,46 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase { | |||
return sb.toString(); | |||
} | |||
/** | |||
* 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 |
@@ -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(); | |||
} | |||
} |