Browse Source

Make forPath(ObjectReader) variant in TreeWalk

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>
stable-0.9
Shawn O. Pearce 15 years ago
parent
commit
80fe789690
  1. 48
      org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java

48
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java

@ -56,8 +56,8 @@ import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.MutableObjectId; import org.eclipse.jgit.lib.MutableObjectId;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.treewalk.filter.PathFilterGroup; import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
import org.eclipse.jgit.treewalk.filter.TreeFilter; import org.eclipse.jgit.treewalk.filter.TreeFilter;
@ -84,6 +84,42 @@ import org.eclipse.jgit.util.RawParseUtils;
* permitted, even from concurrent threads. * permitted, even from concurrent threads.
*/ */
public class TreeWalk { 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. * Open a tree walk and filter to exactly one path.
* <p> * <p>
@ -112,15 +148,11 @@ public class TreeWalk {
public static TreeWalk forPath(final Repository db, final String path, public static TreeWalk forPath(final Repository db, final String path,
final AnyObjectId... trees) throws MissingObjectException, final AnyObjectId... trees) throws MissingObjectException,
IncorrectObjectTypeException, CorruptObjectException, IOException { IncorrectObjectTypeException, CorruptObjectException, IOException {
final TreeWalk r = new TreeWalk(db); ObjectReader reader = db.newObjectReader();
try { try {
r.setFilter(PathFilterGroup.createFromStrings(Collections return forPath(reader, path, trees);
.singleton(path)));
r.setRecursive(r.getFilter().shouldBeRecursive());
r.reset(trees);
return r.next() ? r : null;
} finally { } finally {
r.release(); reader.release();
} }
} }

Loading…
Cancel
Save