diff options
author | Robin Stocker <robin@nibor.org> | 2012-10-28 15:35:21 +0100 |
---|---|---|
committer | Chris Aniszczyk <zx@twitter.com> | 2012-11-01 10:33:50 -0700 |
commit | 3f1d56d6b7105eec88eea59730a5d78f668df179 (patch) | |
tree | 85998a8ca422164e5ffad6c7ddfede4de38225e8 /org.eclipse.jgit/src/org | |
parent | 8acaae802c8908712663b0c21b7b09ac602ecb1d (diff) | |
download | jgit-3f1d56d6b7105eec88eea59730a5d78f668df179.tar.gz jgit-3f1d56d6b7105eec88eea59730a5d78f668df179.zip |
ResetCommand: Correctly reset unmerged paths in resetIndexForPaths
The previous implementation used a PathEdit, which does not reset the
stage of the entry.
Bug: 391860
Change-Id: If26d3a35abfee85424ad69de724f06a28b6e9efb
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
Diffstat (limited to 'org.eclipse.jgit/src/org')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java | 37 |
1 files changed, 12 insertions, 25 deletions
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 fc3d147c68..7f5eb0244c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java @@ -51,6 +51,8 @@ import org.eclipse.jgit.api.errors.CheckoutConflictException; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.dircache.DirCacheBuildIterator; +import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheCheckout; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath; @@ -59,7 +61,6 @@ import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.dircache.DirCacheIterator; import org.eclipse.jgit.internal.JGitText; 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; @@ -276,44 +277,30 @@ public class ResetCommand extends GitCommand<Ref> { private void resetIndexForPaths(RevCommit commit) { DirCache dc = null; - final DirCacheEditor edit; try { dc = repo.lockDirCache(); - edit = dc.editor(); + DirCacheBuilder builder = dc.builder(); final TreeWalk tw = new TreeWalk(repo); - tw.addTree(new DirCacheIterator(dc)); + tw.addTree(new DirCacheBuildIterator(builder)); tw.addTree(commit.getTree()); tw.setFilter(PathFilterGroup.createFromStrings(filepaths)); tw.setRecursive(true); while (tw.next()) { - final String path = tw.getPathString(); - // DirCacheIterator dci = tw.getTree(0, DirCacheIterator.class); final CanonicalTreeParser tree = tw.getTree(1, CanonicalTreeParser.class); - if (tree == null) - // file is not in the commit, remove from index - edit.add(new DirCacheEditor.DeletePath(path)); - 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(entryFileMode); - ent.setObjectId(entryObjectId); - ent.setLastModified(0); - } - }); + // only keep file in index if it's in the commit + if (tree != null) { + // revert index to commit + DirCacheEntry entry = new DirCacheEntry(tw.getRawPath()); + entry.setFileMode(tree.getEntryFileMode()); + entry.setObjectId(tree.getEntryObjectId()); + builder.add(entry); } } - edit.commit(); + builder.commit(); } catch (IOException e) { throw new RuntimeException(e); } finally { |