|
|
|
@ -49,9 +49,10 @@ import java.util.LinkedList;
|
|
|
|
|
|
|
|
|
|
import org.eclipse.jgit.api.errors.JGitInternalException; |
|
|
|
|
import org.eclipse.jgit.dircache.DirCache; |
|
|
|
|
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; |
|
|
|
|
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit; |
|
|
|
|
import org.eclipse.jgit.dircache.DirCacheEntry; |
|
|
|
|
import org.eclipse.jgit.dircache.DirCacheIterator; |
|
|
|
|
import org.eclipse.jgit.internal.JGitText; |
|
|
|
@ -64,6 +65,7 @@ import org.eclipse.jgit.lib.Repository;
|
|
|
|
|
import org.eclipse.jgit.lib.RepositoryState; |
|
|
|
|
import org.eclipse.jgit.revwalk.RevCommit; |
|
|
|
|
import org.eclipse.jgit.revwalk.RevWalk; |
|
|
|
|
import org.eclipse.jgit.treewalk.AbstractTreeIterator; |
|
|
|
|
import org.eclipse.jgit.treewalk.CanonicalTreeParser; |
|
|
|
|
import org.eclipse.jgit.treewalk.TreeWalk; |
|
|
|
|
import org.eclipse.jgit.treewalk.filter.PathFilterGroup; |
|
|
|
@ -313,14 +315,49 @@ public class ResetCommand extends GitCommand<Ref> {
|
|
|
|
|
|
|
|
|
|
private void resetIndex(RevCommit commit) throws IOException { |
|
|
|
|
DirCache dc = repo.lockDirCache(); |
|
|
|
|
TreeWalk walk = null; |
|
|
|
|
try { |
|
|
|
|
dc.clear(); |
|
|
|
|
DirCacheBuilder dcb = dc.builder(); |
|
|
|
|
dcb.addTree(new byte[0], 0, repo.newObjectReader(), |
|
|
|
|
commit.getTree()); |
|
|
|
|
dcb.commit(); |
|
|
|
|
DirCacheEditor editor = dc.editor(); |
|
|
|
|
|
|
|
|
|
walk = new TreeWalk(repo); |
|
|
|
|
walk.addTree(commit.getTree()); |
|
|
|
|
walk.addTree(new DirCacheIterator(dc)); |
|
|
|
|
walk.setRecursive(true); |
|
|
|
|
|
|
|
|
|
while (walk.next()) { |
|
|
|
|
AbstractTreeIterator cIter = walk.getTree(0, |
|
|
|
|
AbstractTreeIterator.class); |
|
|
|
|
if (cIter == null) { |
|
|
|
|
editor.add(new DeletePath(walk.getPathString())); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
final DirCacheEntry entry = new DirCacheEntry(walk.getRawPath()); |
|
|
|
|
entry.setFileMode(cIter.getEntryFileMode()); |
|
|
|
|
entry.setObjectIdFromRaw(cIter.idBuffer(), cIter.idOffset()); |
|
|
|
|
|
|
|
|
|
DirCacheIterator dcIter = walk.getTree(1, |
|
|
|
|
DirCacheIterator.class); |
|
|
|
|
if (dcIter != null && dcIter.idEqual(cIter)) { |
|
|
|
|
DirCacheEntry indexEntry = dcIter.getDirCacheEntry(); |
|
|
|
|
entry.setLastModified(indexEntry.getLastModified()); |
|
|
|
|
entry.setLength(indexEntry.getLength()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
editor.add(new PathEdit(entry) { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void apply(DirCacheEntry ent) { |
|
|
|
|
ent.copyMetaData(entry); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
editor.commit(); |
|
|
|
|
} finally { |
|
|
|
|
dc.unlock(); |
|
|
|
|
if (walk != null) |
|
|
|
|
walk.release(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|