Convert RevisionSyntaxExceptions to 404s

Catch these and return null from RevisionParser.parse(), causing
ViewFilter to treat them as missing (404) rather than errors (500).

Change-Id: I1a3fe5511b0db941c80d1ad6060e766a439d7a07
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
index 3e0acfa..cabde7c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionParser.java
@@ -22,6 +22,7 @@
 import com.google.common.base.Splitter;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.RevisionSyntaxException;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -126,7 +127,7 @@
             if (!isValidRevision(oldName)) {
               return null;
             } else {
-              ObjectId old = repo.resolve(oldName);
+              ObjectId old = resolve(oldName);
               if (old == null) {
                 return null;
               }
@@ -143,7 +144,7 @@
             if (!isValidRevision(name)) {
               return null;
             }
-            ObjectId id = repo.resolve(name);
+            ObjectId id = resolve(name);
             if (id == null) {
               return null;
             }
@@ -168,7 +169,7 @@
         if (!isValidRevision(name)) {
           return null;
         }
-        ObjectId id = repo.resolve(name);
+        ObjectId id = resolve(name);
         if (id != null) {
           int pathStart;
           if (oldRevision == null) {
@@ -188,6 +189,14 @@
     }
   }
 
+  private ObjectId resolve(String name) throws IOException {
+    try {
+      return repo.resolve(name);
+    } catch (RevisionSyntaxException e) {
+      return null;
+    }
+  }
+
   private static boolean isValidRevision(String revision) {
     // Disallow some uncommon but valid revision expressions that either we
     // don't support or we represent differently in our URLs.
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
index b0be155..d2480f9 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
@@ -53,6 +53,7 @@
     assertEquals(new Result(Revision.peeled("refs/heads/master", master)),
         parser.parse("refs/heads/master"));
     assertNull(parser.parse("refs//heads//master"));
+    assertNull(parser.parse("refs heads master"));
   }
 
   public void testParseRefParentExpression() throws Exception {
@@ -67,6 +68,7 @@
     assertEquals(new Result(Revision.peeled("master^", parent1)), parser.parse("master^"));
     assertEquals(new Result(Revision.peeled("master~1", parent1)), parser.parse("master~1"));
     assertEquals(new Result(Revision.peeled("master^2", parent2)), parser.parse("master^2"));
+    assertNull(parser.parse("master^3"));
     assertEquals(new Result(Revision.peeled("master~2", root)), parser.parse("master~2"));
   }