Example usage for org.eclipse.jgit.treewalk TreeWalk getTreeCount

List of usage examples for org.eclipse.jgit.treewalk TreeWalk getTreeCount

Introduction

In this page you can find the example usage for org.eclipse.jgit.treewalk TreeWalk getTreeCount.

Prototype

public int getTreeCount() 

Source Link

Document

Get the number of trees known to this walker.

Usage

From source file:com.mpdeimos.ct_tests.vcs.GitFileDiff.java

License:Apache License

/**
 * Computer file diffs for specified tree walk and commit
 *
 * @param walk/*ww  w  .  jav  a  2s .  com*/
 * @param commit
 * @return non-null but possibly empty array of file diffs
 * @throws MissingObjectException
 * @throws IncorrectObjectTypeException
 * @throws CorruptObjectException
 * @throws IOException
 */
public static GitFileDiff[] compute(final TreeWalk walk, final RevCommit commit)
        throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException {
    final ArrayList<GitFileDiff> r = new ArrayList<GitFileDiff>();

    if (commit.getParentCount() > 0)
        walk.reset(trees(commit));
    else {
        walk.reset();
        walk.addTree(new EmptyTreeIterator());
        walk.addTree(commit.getTree());
    }

    if (walk.getTreeCount() <= 2) {
        List<DiffEntry> entries = DiffEntry.scan(walk);
        for (DiffEntry entry : entries) {
            final GitFileDiff d = new GitFileDiff(commit, entry);
            r.add(d);
        }
    } else { // DiffEntry does not support walks with more than two trees
        final int nTree = walk.getTreeCount();
        final int myTree = nTree - 1;
        while (walk.next()) {
            if (matchAnyParent(walk, myTree))
                continue;

            final GitFileDiffForMerges d = new GitFileDiffForMerges(commit);
            d.path = walk.getPathString();
            int m0 = 0;
            for (int i = 0; i < myTree; i++)
                m0 |= walk.getRawMode(i);
            final int m1 = walk.getRawMode(myTree);
            d.change = ChangeType.MODIFY;
            if (m0 == 0 && m1 != 0)
                d.change = ChangeType.ADD;
            else if (m0 != 0 && m1 == 0)
                d.change = ChangeType.DELETE;
            else if (m0 != m1 && walk.idEqual(0, myTree))
                d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged
            d.blobs = new ObjectId[nTree];
            d.modes = new FileMode[nTree];
            for (int i = 0; i < nTree; i++) {
                d.blobs[i] = walk.getObjectId(i);
                d.modes[i] = walk.getFileMode(i);
            }
            r.add(d);
        }

    }

    final GitFileDiff[] tmp = new GitFileDiff[r.size()];
    r.toArray(tmp);
    return tmp;
}

From source file:com.xiplink.jira.git.FileDiff.java

License:Open Source License

static FileDiff[] compute(final TreeWalk walk, final RevCommit commit)
        throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException {
    final ArrayList<FileDiff> r = new ArrayList<FileDiff>();

    if (commit.getParentCount() > 0) {
        walk.reset(trees(commit));/* www  .  j a  v a 2  s  .co m*/
    } else {
        walk.reset();
        walk.addTree(new EmptyTreeIterator());
        walk.addTree(commit.getTree());
    }

    if (walk.getTreeCount() <= 2) {
        List<DiffEntry> entries = DiffEntry.scan(walk);
        int number = 0;
        for (DiffEntry entry : entries) {
            final FileDiff d = new FileDiff(commit, entry, number);
            r.add(d);
            number++;
        }
    } else { // DiffEntry does not support walks with more than two trees
        final int nTree = walk.getTreeCount();
        final int myTree = nTree - 1;
        while (walk.next()) {
            if (matchAnyParent(walk, myTree)) {
                continue;
            }

            final FileDiffForMerges d = new FileDiffForMerges(commit);
            d.path = walk.getPathString();
            int m0 = 0;
            for (int i = 0; i < myTree; i++) {
                m0 |= walk.getRawMode(i);
            }
            final int m1 = walk.getRawMode(myTree);
            d.change = ChangeType.MODIFY;
            if (m0 == 0 && m1 != 0) {
                d.change = ChangeType.ADD;
            } else if (m0 != 0 && m1 == 0) {
                d.change = ChangeType.DELETE;
            } else if (m0 != m1 && walk.idEqual(0, myTree)) {
                d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged
            }
            d.blobs = new ObjectId[nTree];
            d.modes = new FileMode[nTree];
            for (int i = 0; i < nTree; i++) {
                d.blobs[i] = walk.getObjectId(i);
                d.modes[i] = walk.getFileMode(i);
            }
            r.add(d);
        }

    }

    final FileDiff[] tmp = new FileDiff[r.size()];
    r.toArray(tmp);
    return tmp;
}

From source file:jetbrains.buildServer.buildTriggers.vcs.git.submodules.IgnoreSubmoduleErrorsTreeFilter.java

License:Apache License

@Override
public boolean include(TreeWalk walker) throws IOException {
    if (myRoot.isCheckoutSubmodules()) {
        String path = walker.getPathString();
        if (isFirstTreeHasBrokenSubmodule(walker, path)) {
            myBrokenSubmodulePathsInFirstTree.add(path);
            return false;
        } else if (!myBrokenSubmodulePathsInRestTrees.contains(path)) {
            for (int i = 1; i < walker.getTreeCount(); i++) {
                if (isTreeIteratorOnBrokenSubmoduleEntry(walker, i)) {
                    myBrokenSubmodulePathsInRestTrees.add(path);
                }//from  w w  w . j a  v a2s .  c  o m
            }
        }
        return TreeFilter.ANY_DIFF.include(walker);
    } else {
        return TreeFilter.ANY_DIFF.include(walker);
    }
}

From source file:org.eclipse.egit.core.internal.merge.TreeWalkResourceVariantTreeProvider.java

License:Open Source License

/**
 * Constructs the resource variant trees by iterating over the given tree
 * walk. This TreeWalk must contain at least three trees corresponding to
 * the three "sides" we need.// ww w.java2 s  .c o m
 * <p>
 * The tree walk will be reset to its initial state when we are done with
 * the iteration.
 * </p>
 *
 * @param repository
 *            The repository this tree walk has been created for.
 * @param treeWalk
 *            The tree walk to iterate over.
 * @param baseIndex
 *            Index of the ancestor tree in the given TreeWalk (value
 *            returned by {@link TreeWalk#addTree(AbstractTreeIterator)})
 * @param ourIndex
 *            Index of our tree in the given TreeWalk (value returned by
 *            {@link TreeWalk#addTree(AbstractTreeIterator)})
 * @param theirIndex
 *            Index of their tree in the given TreeWalk (value returned by
 *            {@link TreeWalk#addTree(AbstractTreeIterator)})
 * @throws IOException
 *             if we somehow cannot iterate over the treewalk.
 */
public TreeWalkResourceVariantTreeProvider(Repository repository, TreeWalk treeWalk, int baseIndex,
        int ourIndex, int theirIndex) throws IOException {
    // Record the initial state of this tree walk before iterating
    final AbstractTreeIterator[] initialTrees = new AbstractTreeIterator[treeWalk.getTreeCount()];
    for (int i = 0; i < treeWalk.getTreeCount(); i++) {
        initialTrees[i] = treeWalk.getTree(i, AbstractTreeIterator.class);
    }

    final GitResourceVariantCache baseCache = new GitResourceVariantCache();
    final GitResourceVariantCache theirsCache = new GitResourceVariantCache();
    final GitResourceVariantCache oursCache = new GitResourceVariantCache();

    while (treeWalk.next()) {
        final int modeBase = treeWalk.getRawMode(baseIndex);
        final int modeOurs = treeWalk.getRawMode(ourIndex);
        final int modeTheirs = treeWalk.getRawMode(theirIndex);
        if (modeBase == 0 && modeOurs == 0 && modeTheirs == 0) {
            // untracked
            continue;
        }

        final CanonicalTreeParser base = treeWalk.getTree(baseIndex, CanonicalTreeParser.class);
        final CanonicalTreeParser ours = treeWalk.getTree(ourIndex, CanonicalTreeParser.class);
        final CanonicalTreeParser theirs = treeWalk.getTree(theirIndex, CanonicalTreeParser.class);

        final IPath path = new Path(treeWalk.getPathString());
        final IResource resource = ResourceUtil.getResourceHandleForLocation(path);
        // Resource variants only make sense for IResources. Do not consider
        // files outside of the workspace or otherwise non accessible.
        if (resource != null && resource.getProject().isAccessible()) {
            if (modeBase != 0) {
                baseCache.setVariant(resource, TreeParserResourceVariant.create(repository, base));
            }
            if (modeOurs != 0) {
                oursCache.setVariant(resource, TreeParserResourceVariant.create(repository, ours));
            }
            if (modeTheirs != 0) {
                theirsCache.setVariant(resource, TreeParserResourceVariant.create(repository, theirs));
            }
        }

        if (treeWalk.isSubtree()) {
            treeWalk.enterSubtree();
        }
    }

    // TODO any better way to reset the tree walk after an iteration?
    treeWalk.reset();
    for (int i = 0; i < initialTrees.length; i++) {
        initialTrees[i].reset();
        treeWalk.addTree(initialTrees[i]);
    }

    baseTree = new GitCachedResourceVariantTree(baseCache);
    theirsTree = new GitCachedResourceVariantTree(theirsCache);
    oursTree = new GitCachedResourceVariantTree(oursCache);

    roots = new LinkedHashSet<IResource>();
    roots.addAll(baseCache.getRoots());
    roots.addAll(oursCache.getRoots());
    roots.addAll(theirsCache.getRoots());

    knownResources = new LinkedHashSet<IResource>();
    knownResources.addAll(baseCache.getKnownResources());
    knownResources.addAll(oursCache.getKnownResources());
    knownResources.addAll(theirsCache.getKnownResources());
}

From source file:org.eclipse.egit.core.synchronize.GitFolderResourceVariant.java

License:Open Source License

/**
 * @param progress/*  www.  j  av  a 2s .  c  om*/
 * @return members
 * @throws IOException
 */
public IResourceVariant[] getMembers(IProgressMonitor progress) throws IOException {
    if (members != null)
        try {
            return members;
        } finally {
            progress.done();
        }

    Repository repo = getRepository();
    TreeWalk tw = new TreeWalk(repo);
    tw.reset();

    int nth = tw.addTree(getObjectId());
    int iteratorNth = tw.addTree(new FileTreeIterator(repo));

    tw.setFilter(new NotIgnoredFilter(iteratorNth));

    IProgressMonitor monitor = SubMonitor.convert(progress);
    monitor.beginTask(NLS.bind(CoreText.GitFolderResourceVariant_fetchingMembers, this), tw.getTreeCount());

    List<IResourceVariant> result = new ArrayList<IResourceVariant>();
    try {
        while (tw.next()) {
            if (monitor.isCanceled())
                throw new OperationCanceledException();

            ObjectId newObjectId = tw.getObjectId(nth);
            String path = getPath() + "/" + new String(tw.getRawPath()); //$NON-NLS-1$
            if (!newObjectId.equals(zeroId()))
                if (tw.isSubtree())
                    result.add(new GitFolderResourceVariant(repo, getRevCommit(), newObjectId, path));
                else
                    result.add(new GitBlobResourceVariant(repo, getRevCommit(), newObjectId, path));
            monitor.worked(1);
        }

        members = result.toArray(new IResourceVariant[result.size()]);
        return members;
    } finally {
        monitor.done();
    }
}

From source file:org.eclipse.egit.core.synchronize.ThreeWayDiffEntry.java

License:Open Source License

/**
 * Converts the TreeWalk into TreeWayDiffEntry headers.
 *
 * @param walk//  w  ww.ja v  a  2 s.c  o  m
 *            the TreeWalk to walk through. Must have exactly three trees in
 *            this order: local, base and remote and can't be recursive.
 * @return headers describing the changed file.
 * @throws IOException
 *             the repository cannot be accessed.
 * @throws IllegalArgumentException
 *             when {@code walk} doen't have exactly three trees, or when
 *             {@code walk} is recursive
 */
public static List<ThreeWayDiffEntry> scan(TreeWalk walk) throws IOException {
    if (walk.getTreeCount() != 3 && walk.getTreeCount() != 4)
        throw new IllegalArgumentException("TreeWalk need to have three or four trees"); //$NON-NLS-1$
    if (walk.isRecursive())
        throw new IllegalArgumentException("TreeWalk shouldn't be recursive."); //$NON-NLS-1$

    List<ThreeWayDiffEntry> r = new ArrayList<ThreeWayDiffEntry>();
    MutableObjectId idBuf = new MutableObjectId();
    while (walk.next()) {
        ThreeWayDiffEntry e = new ThreeWayDiffEntry();

        walk.getObjectId(idBuf, 0);
        e.localId = AbbreviatedObjectId.fromObjectId(idBuf);

        walk.getObjectId(idBuf, 1);
        e.baseId = AbbreviatedObjectId.fromObjectId(idBuf);

        walk.getObjectId(idBuf, 2);
        e.remoteId = AbbreviatedObjectId.fromObjectId(idBuf);

        boolean localSameAsBase = e.localId.equals(e.baseId);
        if (!A_ZERO.equals(e.localId) && localSameAsBase && e.baseId.equals(e.remoteId))
            continue;

        e.path = walk.getPathString();
        boolean localIsMissing = walk.getFileMode(0) == FileMode.MISSING;
        boolean baseIsMissing = walk.getFileMode(1) == FileMode.MISSING;
        boolean remoteIsMissing = walk.getFileMode(2) == FileMode.MISSING;

        if (localIsMissing || baseIsMissing || remoteIsMissing) {
            if (!localIsMissing && baseIsMissing && remoteIsMissing) {
                e.direction = Direction.OUTGOING;
                e.changeType = ChangeType.ADD;
            } else if (localIsMissing && baseIsMissing && !remoteIsMissing) {
                e.direction = Direction.INCOMING;
                e.changeType = ChangeType.ADD;
            } else if (!localIsMissing && !baseIsMissing && remoteIsMissing) {
                e.direction = Direction.INCOMING;
                e.changeType = ChangeType.DELETE;
            } else if (localIsMissing && !baseIsMissing && !remoteIsMissing) {
                e.direction = Direction.OUTGOING;
                e.changeType = ChangeType.DELETE;
            } else {
                e.direction = Direction.CONFLICTING;
                e.changeType = ChangeType.MODIFY;
            }
        } else {
            if (localSameAsBase && !e.localId.equals(e.remoteId))
                e.direction = Direction.INCOMING;
            else if (e.remoteId.equals(e.baseId) && !e.remoteId.equals(e.localId))
                e.direction = Direction.OUTGOING;
            else
                e.direction = Direction.CONFLICTING;

            e.changeType = ChangeType.MODIFY;
        }

        r.add(e);
        if (walk.isSubtree()) {
            e.isTree = true;
            walk.enterSubtree();
        }
    }

    return r;
}

From source file:org.eclipse.egit.ui.internal.history.FileDiff.java

License:Open Source License

static FileDiff[] compute(final TreeWalk walk, final RevCommit commit)
        throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException {
    final ArrayList<FileDiff> r = new ArrayList<FileDiff>();

    if (commit.getParentCount() > 0)
        walk.reset(trees(commit));/*w w w .  j  a v a  2  s .  c  om*/
    else {
        walk.reset();
        walk.addTree(new EmptyTreeIterator());
        walk.addTree(commit.getTree());
    }

    if (walk.getTreeCount() <= 2) {
        List<DiffEntry> entries = DiffEntry.scan(walk);
        for (DiffEntry entry : entries) {
            final FileDiff d = new FileDiff(commit, entry);
            r.add(d);
        }
    } else { // DiffEntry does not support walks with more than two trees
        final int nTree = walk.getTreeCount();
        final int myTree = nTree - 1;
        while (walk.next()) {
            if (matchAnyParent(walk, myTree))
                continue;

            final FileDiffForMerges d = new FileDiffForMerges(commit);
            d.path = walk.getPathString();
            int m0 = 0;
            for (int i = 0; i < myTree; i++)
                m0 |= walk.getRawMode(i);
            final int m1 = walk.getRawMode(myTree);
            d.change = ChangeType.MODIFY;
            if (m0 == 0 && m1 != 0)
                d.change = ChangeType.ADD;
            else if (m0 != 0 && m1 == 0)
                d.change = ChangeType.DELETE;
            else if (m0 != m1 && walk.idEqual(0, myTree))
                d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged
            d.blobs = new ObjectId[nTree];
            d.modes = new FileMode[nTree];
            for (int i = 0; i < nTree; i++) {
                d.blobs[i] = walk.getObjectId(i);
                d.modes[i] = walk.getFileMode(i);
            }
            r.add(d);
        }

    }

    final FileDiff[] tmp = new FileDiff[r.size()];
    r.toArray(tmp);
    return tmp;
}

From source file:org.eclipse.emf.compare.egit.internal.merge.TreeWalkResourceVariantTreeProvider.java

License:Open Source License

/**
 * Constructs the resource variant trees by iterating over the given tree walk. This TreeWalk must contain
 * at least three trees corresponding to the three "sides" we need.
 * <p>// w  ww . java2s .  c  om
 * The tree walk will be reset to its initial state when we are done with the iteration.
 * </p>
 *
 * @param repository
 *            The repository this tree walk has been created for.
 * @param treeWalk
 *            The tree walk to iterate over.
 * @param baseIndex
 *            Index of the ancestor tree in the given TreeWalk (value returned by
 *            {@link TreeWalk#addTree(AbstractTreeIterator)})
 * @param ourIndex
 *            Index of our tree in the given TreeWalk (value returned by
 *            {@link TreeWalk#addTree(AbstractTreeIterator)})
 * @param theirIndex
 *            Index of their tree in the given TreeWalk (value returned by
 *            {@link TreeWalk#addTree(AbstractTreeIterator)})
 * @throws IOException
 *             if we somehow cannot iterate over the treewalk.
 */
public TreeWalkResourceVariantTreeProvider(Repository repository, TreeWalk treeWalk, int baseIndex,
        int ourIndex, int theirIndex) throws IOException {
    // Record the initial state of this tree walk before iterating
    final AbstractTreeIterator[] initialTrees = new AbstractTreeIterator[treeWalk.getTreeCount()];
    for (int i = 0; i < treeWalk.getTreeCount(); i++) {
        initialTrees[i] = treeWalk.getTree(i, AbstractTreeIterator.class);
    }

    final GitResourceVariantCache baseCache = new GitResourceVariantCache();
    final GitResourceVariantCache theirsCache = new GitResourceVariantCache();
    final GitResourceVariantCache oursCache = new GitResourceVariantCache();

    while (treeWalk.next()) {
        final int modeBase = treeWalk.getRawMode(baseIndex);
        final int modeOurs = treeWalk.getRawMode(ourIndex);
        final int modeTheirs = treeWalk.getRawMode(theirIndex);
        if (!hasSignificantDifference(modeBase, modeOurs, modeTheirs)) {
            // conflict on file modes, leave the default merger handle it
            continue;
        }

        final CanonicalTreeParser base = treeWalk.getTree(baseIndex, CanonicalTreeParser.class);
        final CanonicalTreeParser ours = treeWalk.getTree(ourIndex, CanonicalTreeParser.class);
        final CanonicalTreeParser theirs = treeWalk.getTree(theirIndex, CanonicalTreeParser.class);

        final int nonZeroMode = modeBase != 0 ? modeBase : modeOurs != 0 ? modeOurs : modeTheirs;
        final IResource resource = getResourceHandleForLocation(repository, treeWalk.getPathString(),
                FileMode.fromBits(nonZeroMode) == FileMode.TREE);

        // Resource variants only make sense for IResources.
        if (resource != null) {
            IPath workspacePath = resource.getFullPath();
            if (modeBase != 0) {
                baseCache.setVariant(resource,
                        TreeParserResourceVariant.create(repository, base, workspacePath));
            }
            if (modeOurs != 0) {
                oursCache.setVariant(resource,
                        TreeParserResourceVariant.create(repository, ours, workspacePath));
            }
            if (modeTheirs != 0) {
                theirsCache.setVariant(resource,
                        TreeParserResourceVariant.create(repository, theirs, workspacePath));
            }
        }

        if (treeWalk.isSubtree()) {
            treeWalk.enterSubtree();
        }
    }

    // TODO any better way to reset the tree walk after an iteration?
    treeWalk.reset();
    for (int i = 0; i < initialTrees.length; i++) {
        initialTrees[i].reset();
        treeWalk.addTree(initialTrees[i]);
    }

    baseTree = new GitCachedResourceVariantTree(baseCache);
    theirsTree = new GitCachedResourceVariantTree(theirsCache);
    oursTree = new GitCachedResourceVariantTree(oursCache);

    roots = new LinkedHashSet<IResource>();
    roots.addAll(baseCache.getRoots());
    roots.addAll(oursCache.getRoots());
    roots.addAll(theirsCache.getRoots());

    knownResources = new LinkedHashSet<IResource>();
    knownResources.addAll(baseCache.getKnownResources());
    knownResources.addAll(oursCache.getKnownResources());
    knownResources.addAll(theirsCache.getKnownResources());
}

From source file:org.flowerplatform.web.git.history.internal.FileDiff.java

License:Open Source License

/**
 * Computer file diffs for specified tree walk and commit
 *
 * @param walk/*from ww w .  j  a v a  2  s .  c o  m*/
 * @param commit
 * @param markTreeFilters optional filters for marking entries, see {@link #isMarked(int)}
 * @return non-null but possibly empty array of file diffs
 * @throws MissingObjectException
 * @throws IncorrectObjectTypeException
 * @throws CorruptObjectException
 * @throws IOException
 */
public static FileDiff[] compute(final TreeWalk walk, final RevCommit commit,
        final TreeFilter... markTreeFilters)
        throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException {
    final ArrayList<FileDiff> r = new ArrayList<FileDiff>();

    if (commit.getParentCount() > 0)
        walk.reset(trees(commit));
    else {
        walk.reset();
        walk.addTree(new EmptyTreeIterator());
        walk.addTree(commit.getTree());
    }

    if (walk.getTreeCount() <= 2) {
        List<DiffEntry> entries = DiffEntry.scan(walk, false, markTreeFilters);
        for (DiffEntry entry : entries) {
            final FileDiff d = new FileDiff(commit, entry);
            r.add(d);
        }
    } else { // DiffEntry does not support walks with more than two trees
        final int nTree = walk.getTreeCount();
        final int myTree = nTree - 1;

        TreeFilterMarker treeFilterMarker = new TreeFilterMarker(markTreeFilters);

        while (walk.next()) {
            if (matchAnyParent(walk, myTree))
                continue;

            int treeFilterMarks = treeFilterMarker.getMarks(walk);

            final FileDiffForMerges d = new FileDiffForMerges(commit, treeFilterMarks);
            d.path = walk.getPathString();
            int m0 = 0;
            for (int i = 0; i < myTree; i++)
                m0 |= walk.getRawMode(i);
            final int m1 = walk.getRawMode(myTree);
            d.change = ChangeType.MODIFY;
            if (m0 == 0 && m1 != 0)
                d.change = ChangeType.ADD;
            else if (m0 != 0 && m1 == 0)
                d.change = ChangeType.DELETE;
            else if (m0 != m1 && walk.idEqual(0, myTree))
                d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged
            d.blobs = new ObjectId[nTree];
            d.modes = new FileMode[nTree];
            for (int i = 0; i < nTree; i++) {
                d.blobs[i] = walk.getObjectId(i);
                d.modes[i] = walk.getFileMode(i);
            }

            r.add(d);
        }

    }

    final FileDiff[] tmp = new FileDiff[r.size()];
    r.toArray(tmp);
    return tmp;
}

From source file:org.gitective.core.filter.commit.CommitDiffFilter.java

License:Open Source License

@Override
public boolean include(final RevWalk walker, final RevCommit commit) throws IOException {
    final TreeWalk walk = createTreeWalk(walker, commit);
    final List<DiffEntry> diffs;
    final int treeCount = walk.getTreeCount();
    switch (treeCount) {
    case 0://w  w w.ja v a2 s .co m
    case 1:
        diffs = Collections.emptyList();
        break;
    case 2:
        diffs = DiffEntry.scan(walk);
        break;
    default:
        diffs = new ArrayList<DiffEntry>();
        final MutableObjectId currentId = new MutableObjectId();
        final int currentTree = treeCount - 1;
        while (walk.next()) {
            final int currentMode = walk.getRawMode(currentTree);
            int parentMode = 0;
            boolean same = false;
            for (int i = 0; i < currentTree; i++) {
                final int mode = walk.getRawMode(i);
                same = mode == currentMode && walk.idEqual(currentTree, i);
                if (same)
                    break;
                parentMode |= mode;
            }
            if (same)
                continue;

            final LocalDiffEntry diff = new LocalDiffEntry(walk.getPathString());
            diff.setOldMode(FileMode.fromBits(parentMode));
            diff.setNewMode(FileMode.fromBits(currentMode));
            walk.getObjectId(currentId, currentTree);
            diff.setNewId(AbbreviatedObjectId.fromObjectId(currentId));
            if (parentMode == 0 && currentMode != 0)
                diff.setChangeType(ChangeType.ADD);
            else if (parentMode != 0 && currentMode == 0)
                diff.setChangeType(ChangeType.DELETE);
            else
                diff.setChangeType(ChangeType.MODIFY);
            diffs.add(diff);
        }
    }
    if (detectRenames) {
        renameDetector.reset();
        renameDetector.addAll(diffs);
        return include(walker, commit, renameDetector.compute(walker.getObjectReader(), INSTANCE)) ? true
                : include(false);
    } else
        return include(walker, commit, diffs) ? true : include(false);
}