added resetIndex() to RepositoryTestCase

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>
This commit is contained in:
Christian Halstrick 2010-08-16 18:42:24 +02:00 committed by Shawn O. Pearce
parent a85c08e1c8
commit e02b68a8b7
3 changed files with 55 additions and 23 deletions

View File

@ -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 void testRacyGitDetection() throws IOException,
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 void testRacyGitDetection() throws IOException,
// 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 void testRacyGitDetection() throws IOException,
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);

View File

@ -48,6 +48,7 @@
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.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 String indexState(int includedOptions)
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

View File

@ -211,4 +211,13 @@ public File getFile() {
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();
}
}