Example usage for org.eclipse.jgit.treewalk.filter TreeFilterMarker getMarks

List of usage examples for org.eclipse.jgit.treewalk.filter TreeFilterMarker getMarks

Introduction

In this page you can find the example usage for org.eclipse.jgit.treewalk.filter TreeFilterMarker getMarks.

Prototype

public int getMarks(TreeWalk walk) throws MissingObjectException, IncorrectObjectTypeException, IOException 

Source Link

Document

Test the filters against the walk.

Usage

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//w w  w .ja  v  a 2 s  . co 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;
}