Reuse cached SHA-1 when computing from WorkingTreeIterator
Change-Id: I2b2170c29017993d8cb7a1d3c8cd94fb16c7dd02 Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
This commit is contained in:
parent
461b012e95
commit
a3620cbbe1
|
@ -64,6 +64,7 @@
|
||||||
import org.eclipse.jgit.diff.RawText;
|
import org.eclipse.jgit.diff.RawText;
|
||||||
import org.eclipse.jgit.dircache.DirCache;
|
import org.eclipse.jgit.dircache.DirCache;
|
||||||
import org.eclipse.jgit.dircache.DirCacheEntry;
|
import org.eclipse.jgit.dircache.DirCacheEntry;
|
||||||
|
import org.eclipse.jgit.dircache.DirCacheIterator;
|
||||||
import org.eclipse.jgit.errors.CorruptObjectException;
|
import org.eclipse.jgit.errors.CorruptObjectException;
|
||||||
import org.eclipse.jgit.ignore.IgnoreNode;
|
import org.eclipse.jgit.ignore.IgnoreNode;
|
||||||
import org.eclipse.jgit.ignore.IgnoreRule;
|
import org.eclipse.jgit.ignore.IgnoreRule;
|
||||||
|
@ -181,6 +182,24 @@ protected void initRootIterator(Repository repo) {
|
||||||
ignoreNode = new RootIgnoreNode(entry, repo);
|
ignoreNode = new RootIgnoreNode(entry, repo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the matching {@link DirCacheIterator}, to optimize ObjectIds.
|
||||||
|
*
|
||||||
|
* Once the DirCacheIterator has been set this iterator must only be
|
||||||
|
* advanced by the TreeWalk that is supplied, as it assumes that itself and
|
||||||
|
* the corresponding DirCacheIterator are positioned on the same file path
|
||||||
|
* whenever {@link #idBuffer()} is invoked.
|
||||||
|
*
|
||||||
|
* @param walk
|
||||||
|
* the walk that will be advancing this iterator.
|
||||||
|
* @param treeId
|
||||||
|
* index of the matching {@link DirCacheIterator}.
|
||||||
|
*/
|
||||||
|
public void setDirCacheIterator(TreeWalk walk, int treeId) {
|
||||||
|
state.walk = walk;
|
||||||
|
state.dirCacheTree = treeId;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasId() {
|
public boolean hasId() {
|
||||||
if (contentIdFromPtr == ptr)
|
if (contentIdFromPtr == ptr)
|
||||||
|
@ -192,6 +211,21 @@ public boolean hasId() {
|
||||||
public byte[] idBuffer() {
|
public byte[] idBuffer() {
|
||||||
if (contentIdFromPtr == ptr)
|
if (contentIdFromPtr == ptr)
|
||||||
return contentId;
|
return contentId;
|
||||||
|
|
||||||
|
if (state.walk != null) {
|
||||||
|
// If there is a matching DirCacheIterator, we can reuse
|
||||||
|
// its idBuffer, but only if we appear to be clean against
|
||||||
|
// the cached index information for the path.
|
||||||
|
//
|
||||||
|
DirCacheIterator i = state.walk.getTree(state.dirCacheTree,
|
||||||
|
DirCacheIterator.class);
|
||||||
|
if (i != null) {
|
||||||
|
DirCacheEntry ent = i.getDirCacheEntry();
|
||||||
|
if (ent != null && compareMetadata(ent) == MetadataDiff.EQUAL)
|
||||||
|
return i.idBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (mode & FileMode.TYPE_MASK) {
|
switch (mode & FileMode.TYPE_MASK) {
|
||||||
case FileMode.TYPE_FILE:
|
case FileMode.TYPE_FILE:
|
||||||
contentIdFromPtr = ptr;
|
contentIdFromPtr = ptr;
|
||||||
|
@ -890,6 +924,12 @@ private static final class IteratorState {
|
||||||
/** Buffer used to perform {@link #contentId} computations. */
|
/** Buffer used to perform {@link #contentId} computations. */
|
||||||
byte[] contentReadBuffer;
|
byte[] contentReadBuffer;
|
||||||
|
|
||||||
|
/** TreeWalk with a (supposedly) matching DirCacheIterator. */
|
||||||
|
TreeWalk walk;
|
||||||
|
|
||||||
|
/** Position of the matching {@link DirCacheIterator}. */
|
||||||
|
int dirCacheTree;
|
||||||
|
|
||||||
IteratorState(WorkingTreeOptions options) {
|
IteratorState(WorkingTreeOptions options) {
|
||||||
this.options = options;
|
this.options = options;
|
||||||
this.nameEncoder = Constants.CHARSET.newEncoder();
|
this.nameEncoder = Constants.CHARSET.newEncoder();
|
||||||
|
|
Loading…
Reference in New Issue