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;
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;
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();
}
}