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) {