Include tree contents in the revision page for commits

Change-Id: I5b1912bb291e8db0c821726b2e2b63915ca6d8fe
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index 031b667..52b4ea8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -98,7 +98,7 @@
 
       if (!view.getRevision().nameIsId()) {
         List<Map<String, Object>> tags = Lists.newArrayListWithExpectedSize(1);
-        for (RevObject o : RevisionServlet.listObjects(walk, view.getRevision().getId())) {
+        for (RevObject o : RevisionServlet.listObjects(walk, view.getRevision())) {
           if (o instanceof RevTag) {
             tags.add(new TagSoyData(linkifier, req).toSoyData((RevTag) o));
           }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
index e4d0300..0c5f97f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -70,7 +70,7 @@
       String name = ref.getName().substring(prefix.length());
       boolean needPrefix = !ref.getName().equals(refdb.getRef(name).getName());
       result.add(ImmutableMap.of(
-          "url", GitilesView.log().copyFrom(req).setRevision(
+          "url", GitilesView.revision().copyFrom(req).setRevision(
               Revision.unpeeled(needPrefix ? ref.getName() : name, ref.getObjectId())).toUrl(),
           "name", name));
     }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
index ac5cd8f..345f7d2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -64,7 +64,7 @@
 
     RevWalk walk = new RevWalk(repo);
     try {
-      List<RevObject> objects = listObjects(walk, view.getRevision().getId());
+      List<RevObject> objects = listObjects(walk, view.getRevision());
       List<Map<String, ?>> soyObjects = Lists.newArrayListWithCapacity(objects.size());
       boolean hasBlob = false;
 
@@ -120,17 +120,21 @@
   }
 
   // TODO(dborowitz): Extract this.
-  static List<RevObject> listObjects(RevWalk walk, ObjectId id)
+  static List<RevObject> listObjects(RevWalk walk, Revision rev)
       throws MissingObjectException, IOException {
     List<RevObject> objects = Lists.newArrayListWithExpectedSize(1);
+    ObjectId id = rev.getId();
+    RevObject cur;
     while (true) {
-      RevObject cur = walk.parseAny(id);
+      cur = walk.parseAny(id);
       objects.add(cur);
-      if (cur.getType() == Constants.OBJ_TAG) {
-        id = ((RevTag) cur).getObject();
-      } else {
+      if (cur.getType() != Constants.OBJ_TAG) {
         break;
       }
+      id = ((RevTag) cur).getObject();
+    }
+    if (cur.getType() == Constants.OBJ_COMMIT) {
+      objects.add(walk.parseTree(((RevCommit) cur).getTree()));
     }
     return objects;
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
index 6cbf541..66aa207 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TreeSoyData.java
@@ -19,6 +19,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Charsets;
+import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.io.Files;
@@ -56,7 +57,8 @@
 
     // simplifyPath() normalizes "a/../../" to "a", so manually check whether
     // the path leads above the git root.
-    int depth = new StringTokenizer(view.getTreePath(), "/").countTokens();
+    String path = Objects.firstNonNull(view.getTreePath(), "");
+    int depth = new StringTokenizer(path, "/").countTokens();
     for (String part : PATH_SPLITTER.split(target)) {
       if (part.equals("..")) {
         depth--;
@@ -68,7 +70,7 @@
       }
     }
 
-    String path = Files.simplifyPath(view.getTreePath() + "/" + target);
+    path = Files.simplifyPath(view.getTreePath() + "/" + target);
     return GitilesView.path()
         .copyFrom(view)
         .setTreePath(!path.equals(".") ? path : "")