From: Dariusz Luksza Date: Wed, 6 Jul 2011 22:27:14 +0000 (+0200) Subject: Add support for reseting on directories X-Git-Tag: v1.1.0.201109011030-rc2~39 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1d1f5727716bf8626869064812a05a3e39e1d0f2;p=jgit.git Add support for reseting on directories Reset command should works recursively and allows reset all changed files in given directory. Bug: 348524 Change-Id: I441db34f226be36548c61cef77958995971498de Signed-off-by: Dariusz Luksza Signed-off-by: Chris Aniszczyk --- diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java index f79592f223..e6d689a18a 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java @@ -93,6 +93,16 @@ public class ResetCommandTest extends RepositoryTestCase { 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); @@ -101,8 +111,9 @@ public class ResetCommandTest extends RepositoryTestCase { 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()); @@ -110,7 +121,9 @@ public class ResetCommandTest extends RepositoryTestCase { // 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(), @@ -220,6 +233,33 @@ public class ResetCommandTest extends RepositoryTestCase { 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(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java index 206d4062b7..05f59950ff 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java @@ -56,6 +56,7 @@ import org.eclipse.jgit.dircache.DirCacheEditor; 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; @@ -267,6 +268,7 @@ public class ResetCommand extends GitCommand { 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(); @@ -276,13 +278,18 @@ public class ResetCommand extends GitCommand { 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); } });