Allow log views to have no revision, implying HEAD

Resolving HEAD happens in LogServlet rather than ViewFilter because "log
view with no revision" is still the most accurate description of the
URL.

Change-Id: Ibc8b370f0c8e46dd8304fd6cdb3f8a9417e979fa
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
index df6e1ef..f48ec3b 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -28,6 +28,7 @@
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
 
+import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.revwalk.RevObject;
 
 import java.io.UnsupportedEncodingException;
@@ -309,7 +310,7 @@
     }
 
     private void checkLog() {
-      checkRevision();
+      checkRepositoryIndex();
     }
 
     private void checkPath() {
@@ -474,13 +475,16 @@
         url.append('/').append(path);
         break;
       case LOG:
-        url.append(repositoryName).append("/+log/");
-        if (oldRevision != Revision.NULL) {
-          url.append(oldRevision.getName()).append("..");
-        }
-        url.append(revision.getName());
-        if (path != null) {
-          url.append('/').append(path);
+        url.append(repositoryName).append("/+log");
+        if (revision != Revision.NULL) {
+          url.append('/');
+          if (oldRevision != Revision.NULL) {
+            url.append(oldRevision.getName()).append("..");
+          }
+          url.append(revision.getName());
+          if (path != null) {
+            url.append('/').append(path);
+          }
         }
         break;
       default:
@@ -530,12 +534,16 @@
       // separate links in "old..new".
       breadcrumbs.add(breadcrumb(getRevisionRange(), diff().copyFrom(this).setTreePath("")));
     } else if (type == Type.LOG) {
-      // TODO(dborowitz): Add something in the navigation area (probably not
-      // a breadcrumb) to allow switching between /+log/ and /+/.
-      if (oldRevision == Revision.NULL) {
-        breadcrumbs.add(breadcrumb(revision.getName(), log().copyFrom(this).setTreePath(null)));
+      if (revision != Revision.NULL) {
+        // TODO(dborowitz): Add something in the navigation area (probably not
+        // a breadcrumb) to allow switching between /+log/ and /+/.
+        if (oldRevision == Revision.NULL) {
+          breadcrumbs.add(breadcrumb(revision.getName(), log().copyFrom(this).setTreePath(null)));
+        } else {
+          breadcrumbs.add(breadcrumb(getRevisionRange(), log().copyFrom(this).setTreePath(null)));
+        }
       } else {
-        breadcrumbs.add(breadcrumb(getRevisionRange(), log().copyFrom(this).setTreePath(null)));
+        breadcrumbs.add(breadcrumb(Constants.HEAD, log().copyFrom(this)));
       }
       path = Strings.emptyToNull(path);
     } else if (revision != Revision.NULL) {