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:
parent
a85c08e1c8
commit
e02b68a8b7
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue