Fix NPE in DiffServlet for missing path
The isFile method added by Ib11706aa did not handle the case where
TreeWalk.forPath returns null, as it does for a missing path.
This affected any diff URL with a non-empty, nonexistent path, e.g.:
/project/+diff/master/notfound
Change-Id: I5c99be0cbdc99174c4a21b4deae6ac5b5bbd13fd
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
index ebe89e2..7af19e2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -65,15 +65,22 @@
Repository repo = ServletUtils.getRepository(req);
RevWalk walk = new RevWalk(repo);
+ TreeWalk tw = null;
try {
boolean showCommit, isFile;
AbstractTreeIterator oldTree;
AbstractTreeIterator newTree;
try {
+ tw = newTreeWalk(walk, view);
+ if (tw == null && !view.getPathPart().isEmpty()) {
+ res.setStatus(SC_NOT_FOUND);
+ return;
+ }
+ isFile = tw != null && isFile(tw);
+
// If we are viewing the diff between a commit and one of its parents,
// include the commit detail in the rendered page.
showCommit = isParentOf(walk, view.getOldRevision(), view.getRevision());
- isFile = showCommit ? isFile(walk, view) : false;
oldTree = getTreeIterator(walk, view.getOldRevision().getId());
newTree = getTreeIterator(walk, view.getRevision().getId());
} catch (MissingObjectException | IncorrectObjectTypeException e) {
@@ -116,10 +123,23 @@
out.close();
}
} finally {
+ if (tw != null) {
+ tw.release();
+ }
walk.release();
}
}
+ private static TreeWalk newTreeWalk(RevWalk walk, GitilesView view) throws IOException {
+ if (view.getPathPart().isEmpty()) {
+ return null;
+ }
+ return TreeWalk.forPath(
+ walk.getObjectReader(),
+ view.getPathPart(),
+ walk.parseTree(view.getRevision().getId()));
+ }
+
private static boolean isParentOf(RevWalk walk, Revision oldRevision, Revision newRevision)
throws MissingObjectException, IncorrectObjectTypeException, IOException {
RevCommit newCommit = walk.parseCommit(newRevision.getId());
@@ -130,19 +150,8 @@
}
}
- private static boolean isFile(RevWalk walk, GitilesView view) throws IOException {
- if (view.getPathPart().equals("")) {
- return false;
- }
- TreeWalk tw = TreeWalk.forPath(
- walk.getObjectReader(),
- view.getPathPart(),
- walk.parseTree(view.getRevision().getId()));
- try {
- return (tw.getRawMode(0) & FileMode.TYPE_FILE) > 0;
- } finally {
- tw.release();
- }
+ private static boolean isFile(TreeWalk tw) {
+ return (tw.getRawMode(0) & FileMode.TYPE_FILE) > 0;
}
private String[] renderAndSplit(Map<String, Object> data) {