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; package org.eclipse.jgit.lib;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.TreeSet; 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.FileTreeIterator;
import org.eclipse.jgit.treewalk.FileTreeIteratorWithTimeControl; import org.eclipse.jgit.treewalk.FileTreeIteratorWithTimeControl;
import org.eclipse.jgit.treewalk.NameConflictTreeWalk; import org.eclipse.jgit.treewalk.NameConflictTreeWalk;
@ -133,7 +130,7 @@ public void testRacyGitDetection() throws IOException,
modTimes.add(fsTick(lastFile)); modTimes.add(fsTick(lastFile));
// now add both files to the index. No racy git expected // now add both files to the index. No racy git expected
addToIndex(modTimes); resetIndex(new FileTreeIteratorWithTimeControl(db, modTimes));
assertEquals( assertEquals(
"[a, mode:100644, time:t0, length:1, sha1:2e65efe2a145dda7ee51d1741299f848e5bf752e]" + "[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 // 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 // it's modification time is exactly the same as the previous index file
// mod time. // mod time.
addToIndex(modTimes); resetIndex(new FileTreeIteratorWithTimeControl(db, modTimes));
db.readDirCache(); db.readDirCache();
// although racily clean a should not be reported as being dirty // 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)); 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 { private File addToWorkDir(String path, String content) throws IOException {
File f = new File(db.getWorkTree(), path); File f = new File(db.getWorkTree(), path);
FileOutputStream fos = new FileOutputStream(f); FileOutputStream fos = new FileOutputStream(f);

View File

@ -48,6 +48,7 @@
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
@ -56,9 +57,12 @@
import java.util.TreeSet; import java.util.TreeSet;
import org.eclipse.jgit.dircache.DirCache; 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.dircache.DirCacheIterator;
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.storage.file.FileRepository; import org.eclipse.jgit.storage.file.FileRepository;
import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.NameConflictTreeWalk; import org.eclipse.jgit.treewalk.NameConflictTreeWalk;
/** /**
@ -202,6 +206,46 @@ public String indexState(int includedOptions)
return sb.toString(); 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 * 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 * used create short names for objects to produce small and stable debug

View File

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