From 3f1d56d6b7105eec88eea59730a5d78f668df179 Mon Sep 17 00:00:00 2001 From: Robin Stocker Date: Sun, 28 Oct 2012 15:35:21 +0100 Subject: 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 --- .../src/org/eclipse/jgit/api/ResetCommand.java | 37 +++++++--------------- 1 file changed, 12 insertions(+), 25 deletions(-) (limited to 'org.eclipse.jgit') 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 { 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 { -- cgit v1.2.3