From cd1141cd45e8148c2d3fc5553ae19c9fee3fc4a6 Mon Sep 17 00:00:00 2001 From: Jens Baumgart Date: Thu, 12 Aug 2010 18:28:07 +0200 Subject: [PATCH] Improve IndexDiff performance Exclude ignored files from IndexDiff tree walk. This makes EGit commit much faster. Change-Id: I398499510c22c37667b7612db32eac3b31d325f0 Signed-off-by: Jens Baumgart Signed-off-by: Chris Aniszczyk --- .../src/org/eclipse/jgit/lib/IndexDiff.java | 5 + .../treewalk/filter/NotIgnoredFilter.java | 92 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java index a721f4b663..59d10f68c7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java @@ -56,6 +56,8 @@ import org.eclipse.jgit.treewalk.AbstractTreeIterator; import org.eclipse.jgit.treewalk.EmptyTreeIterator; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.WorkingTreeIterator; +import org.eclipse.jgit.treewalk.filter.AndTreeFilter; +import org.eclipse.jgit.treewalk.filter.NotIgnoredFilter; import org.eclipse.jgit.treewalk.filter.TreeFilter; /** @@ -158,6 +160,8 @@ public class IndexDiff { treeWalk.addTree(new DirCacheIterator(dirCache)); treeWalk.addTree(initialWorkingTreeIterator); treeWalk.setFilter(TreeFilter.ANY_DIFF); + treeWalk.setFilter(AndTreeFilter.create(TreeFilter.ANY_DIFF, + new NotIgnoredFilter(WORKDIR))); while (treeWalk.next()) { AbstractTreeIterator treeIterator = treeWalk.getTree(TREE, AbstractTreeIterator.class); @@ -255,4 +259,5 @@ public class IndexDiff { public HashSet getUntracked() { return untracked; } + } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java new file mode 100644 index 0000000000..122ce40344 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/NotIgnoredFilter.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2010, Jens Baumgart + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.eclipse.jgit.treewalk.filter; + +import java.io.IOException; + +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.errors.MissingObjectException; +import org.eclipse.jgit.treewalk.TreeWalk; +import org.eclipse.jgit.treewalk.WorkingTreeIterator; + +/** + * This filter includes workdir entries that are not ignored. This class is + * immutable. + */ +public class NotIgnoredFilter extends TreeFilter { + + private final int workdirTreeIndex; + + /** + * constructor + * + * @param workdirTreeIndex + * index of the workdir tree in the tree walk + */ + public NotIgnoredFilter(final int workdirTreeIndex) { + this.workdirTreeIndex = workdirTreeIndex; + } + + @Override + public boolean include(TreeWalk walker) throws MissingObjectException, + IncorrectObjectTypeException, IOException { + WorkingTreeIterator workingTreeIterator = walker.getTree( + workdirTreeIndex, WorkingTreeIterator.class); + if (workingTreeIterator != null) + // do not include ignored entries + return !workingTreeIterator.isEntryIgnored(); + return true; + } + + @Override + public boolean shouldBeRecursive() { + return false; + } + + @Override + public TreeFilter clone() { + // immutable + return this; + } + +} -- 2.39.5