Properly handle empty and missing paths when building TreeWalks TreeWalk.forPath may behave in two ways we weren't handling correctly: -throws IllegalArgumentException when the path passed in was empty. -returns null when the path is not found. Validate inputs and outputs where this method is used. Change-Id: I63d33a9fc6e5d56265dc3a96b7d6d6585a8ae2de
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java index dc761b0..d9ef0bf 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/ArchiveServlet.java
@@ -18,6 +18,7 @@ import static javax.servlet.http.HttpServletResponse.SC_OK; import com.google.common.base.Optional; +import com.google.common.base.Strings; import org.eclipse.jgit.api.ArchiveCommand; import org.eclipse.jgit.api.errors.GitAPIException; @@ -81,11 +82,11 @@ RevWalk rw = new RevWalk(repo); try { RevTree tree = rw.parseTree(rev.getId()); - if (view.getPathPart() == null) { + if (Strings.isNullOrEmpty(view.getPathPart())) { return tree; } TreeWalk tw = TreeWalk.forPath(rw.getObjectReader(), view.getPathPart(), tree); - if (tw.getFileMode(0) != FileMode.TREE) { + if (tw == null || tw.getFileMode(0) != FileMode.TREE) { return ObjectId.zeroId(); } return tw.getObjectId(0);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/BlameServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/BlameServlet.java index a18ca16..21ce0d5 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/BlameServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/BlameServlet.java
@@ -17,6 +17,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; +import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -95,8 +96,11 @@ private static ObjectId resolveBlob(GitilesView view, RevWalk rw, RevCommit commit) throws IOException { try { + if (Strings.isNullOrEmpty(view.getPathPart())) { + return null; + } TreeWalk tw = TreeWalk.forPath(rw.getObjectReader(), view.getPathPart(), commit.getTree()); - if ((tw.getRawMode(0) & FileMode.TYPE_FILE) == 0) { + if (tw == null || (tw.getRawMode(0) & FileMode.TYPE_FILE) == 0) { return null; } return tw.getObjectId(0);