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;
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]" +
// 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
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);
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
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;
/**
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
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();
+ }
}