|
|
@@ -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 { |