Fix IllegalStateException if repository not found

Deep links to files within a deleted or moved repository threw
IllegalStateException due to ViewFilter.parseRevision accessing an
unset ATTRIBUTE_REPOSITORY.  This was caused by c709c4cbcf passing
through missing repositories to support host index prefix matching.

Check for the missing repository case and return null to force the
ViewFilter to respond with 404.

Change-Id: I75d05105c336fb9707707859921172e9a39f516e
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
index 9792270..3bd5e09 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -85,6 +85,10 @@
     return path.isEmpty() || path.equals("/");
   }
 
+  private static boolean hasRepository(HttpServletRequest req) {
+    return req.getAttribute(ATTRIBUTE_REPOSITORY) != null;
+  }
+
   private final GitilesUrls urls;
   private final GitilesAccess.Factory accessFactory;
   private final VisibilityCache visibilityCache;
@@ -154,7 +158,11 @@
 
     if (command.isEmpty()) {
       return parseNoCommand(req, repoName);
-    } else if (command.equals(CMD_ARCHIVE)) {
+    }
+    if (!hasRepository(req)) {
+      return null; // no repository? return null to 404.
+    }
+    if (command.equals(CMD_ARCHIVE)) {
       return parseArchiveCommand(req, repoName, path);
     } else if (command.equals(CMD_AUTO)) {
       return parseAutoCommand(req, repoName, path);
@@ -179,7 +187,7 @@
 
   private GitilesView.Builder parseNoCommand(HttpServletRequest req,
       String repoName) {
-    if (req.getAttribute(ATTRIBUTE_REPOSITORY) == null) {
+    if (!hasRepository(req)) {
       return GitilesView.hostIndex().setRepositoryPrefix(repoName);
     }
     return GitilesView.repositoryIndex().setRepositoryName(repoName);