git = new Git(db);
initialCommit = git.commit().setMessage("initial commit").call();
+ // create nested file
+ File dir = new File(db.getWorkTree(), "dir");
+ FileUtils.mkdir(dir);
+ File nestedFile = new File(dir, "b.txt");
+ FileUtils.createNewFile(nestedFile);
+
+ PrintWriter nesterFileWriter = new PrintWriter(nestedFile);
+ nesterFileWriter.print("content");
+ nesterFileWriter.flush();
+
// create file
indexFile = new File(db.getWorkTree(), "a.txt");
FileUtils.createNewFile(indexFile);
writer.flush();
// add file and commit it
- git.add().addFilepattern("a.txt").call();
- secondCommit = git.commit().setMessage("adding a.txt").call();
+ git.add().addFilepattern("dir").addFilepattern("a.txt").call();
+ secondCommit = git.commit().setMessage("adding a.txt and dir/b.txt")
+ .call();
prestage = DirCache.read(db.getIndexFile(), db.getFS()).getEntry(
indexFile.getName());
// modify file and add to index
writer.print("new content");
writer.close();
- git.add().addFilepattern("a.txt").call();
+ nesterFileWriter.print("new content");
+ nesterFileWriter.close();
+ git.add().addFilepattern("a.txt").addFilepattern("dir").call();
// create a file not added to the index
untrackedFile = new File(db.getWorkTree(),
assertFalse(inIndex(untrackedFile.getName()));
}
+ @Test
+ public void testPathsResetOnDirs() throws Exception {
+ setupRepository();
+
+ DirCacheEntry preReset = DirCache.read(db.getIndexFile(), db.getFS())
+ .getEntry("dir/b.txt");
+ assertNotNull(preReset);
+
+ git.add().addFilepattern(untrackedFile.getName()).call();
+
+ // 'dir/b.txt' has already been modified in setupRepository
+ git.reset().addPath("dir").call();
+
+ DirCacheEntry postReset = DirCache.read(db.getIndexFile(), db.getFS())
+ .getEntry("dir/b.txt");
+ assertNotNull(postReset);
+ Assert.assertNotSame(preReset.getObjectId(), postReset.getObjectId());
+
+ // check that HEAD hasn't moved
+ ObjectId head = db.resolve(Constants.HEAD);
+ assertTrue(head.equals(secondCommit));
+ // check if files still exist
+ assertTrue(untrackedFile.exists());
+ assertTrue(inHead("dir/b.txt"));
+ assertTrue(inIndex("dir/b.txt"));
+ }
+
@Test
public void testPathsResetWithRef() throws Exception {
setupRepository();
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.dircache.DirCacheIterator;
import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
tw.addTree(new DirCacheIterator(dc));
tw.addTree(commit.getTree());
tw.setFilter(PathFilterGroup.createFromStrings(filepaths));
+ tw.setRecursive(true);
while (tw.next()) {
final String path = tw.getPathString();
if (tree == null)
// file is not in the commit, remove from index
edit.add(new DirCacheEditor.DeletePath(path));
- else {
- // revert index to commit
+ else { // revert index to commit
+ // it seams that there is concurrent access to tree
+ // variable, therefore we need to keep references to
+ // entryFileMode and entryObjectId in local
+ // variables
+ final FileMode entryFileMode = tree.getEntryFileMode();
+ final ObjectId entryObjectId = tree.getEntryObjectId();
edit.add(new DirCacheEditor.PathEdit(path) {
@Override
public void apply(DirCacheEntry ent) {
- ent.setFileMode(tree.getEntryFileMode());
- ent.setObjectId(tree.getEntryObjectId());
+ ent.setFileMode(entryFileMode);
+ ent.setObjectId(entryObjectId);
ent.setLastModified(0);
}
});