]> source.dussan.org Git - jgit.git/commitdiff
Make forPath(ObjectReader) variant in TreeWalk 80/1180/1
authorShawn O. Pearce <spearce@spearce.org>
Tue, 27 Jul 2010 15:36:24 +0000 (08:36 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 27 Jul 2010 15:36:24 +0000 (08:36 -0700)
This simplifies the logic for those who already have an ObjectReader
on hand want to reuse it to lookup a single path.

Change-Id: Ief17d6b2a0674ddb34bbc9f43121b756eae960fb
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java

index 39e09a330c2d64a34f70b7bc2bbe236c544dd26a..16859646b626d6eb1f1e7324c4ad24e8a28d2878 100644 (file)
@@ -56,8 +56,8 @@ import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.MutableObjectId;
 import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
@@ -84,6 +84,42 @@ import org.eclipse.jgit.util.RawParseUtils;
  * permitted, even from concurrent threads.
  */
 public class TreeWalk {
+       /**
+        * Open a tree walk and filter to exactly one path.
+        * <p>
+        * The returned tree walk is already positioned on the requested path, so
+        * the caller should not need to invoke {@link #next()} unless they are
+        * looking for a possible directory/file name conflict.
+        *
+        * @param reader
+        *            the reader the walker will obtain tree data from.
+        * @param path
+        *            single path to advance the tree walk instance into.
+        * @param trees
+        *            one or more trees to walk through, all with the same root.
+        * @return a new tree walk configured for exactly this one path; null if no
+        *         path was found in any of the trees.
+        * @throws IOException
+        *             reading a pack file or loose object failed.
+        * @throws CorruptObjectException
+        *             an tree object could not be read as its data stream did not
+        *             appear to be a tree, or could not be inflated.
+        * @throws IncorrectObjectTypeException
+        *             an object we expected to be a tree was not a tree.
+        * @throws MissingObjectException
+        *             a tree object was not found.
+        */
+       public static TreeWalk forPath(final ObjectReader reader, final String path,
+                       final AnyObjectId... trees) throws MissingObjectException,
+                       IncorrectObjectTypeException, CorruptObjectException, IOException {
+               final TreeWalk r = new TreeWalk(reader);
+               r.setFilter(PathFilterGroup.createFromStrings(Collections
+                               .singleton(path)));
+               r.setRecursive(r.getFilter().shouldBeRecursive());
+               r.reset(trees);
+               return r.next() ? r : null;
+       }
+
        /**
         * Open a tree walk and filter to exactly one path.
         * <p>
@@ -112,15 +148,11 @@ public class TreeWalk {
        public static TreeWalk forPath(final Repository db, final String path,
                        final AnyObjectId... trees) throws MissingObjectException,
                        IncorrectObjectTypeException, CorruptObjectException, IOException {
-               final TreeWalk r = new TreeWalk(db);
+               ObjectReader reader = db.newObjectReader();
                try {
-                       r.setFilter(PathFilterGroup.createFromStrings(Collections
-                                       .singleton(path)));
-                       r.setRecursive(r.getFilter().shouldBeRecursive());
-                       r.reset(trees);
-                       return r.next() ? r : null;
+                       return forPath(reader, path, trees);
                } finally {
-                       r.release();
+                       reader.release();
                }
        }