Merge changes I91ec7b67,I7df5a595,I88ce867d

* changes:
  Remove unused private methods
  Remove unused import
  Upgrade bucklets to latest revision
diff --git a/README.md b/README.md
index 7c4aed6..21bb473 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,15 @@
 Java code in Gitiles follows the [Google Java Style Guide]
 (https://google.github.io/styleguide/javaguide.html) with a 100-column limit.
 
+Code should be automatically formatted using [google-java-format]
+(https://github.com/google/google-java-format) prior to sending a code review.
+There is currently no Eclipse formatter, but the tool can be run from the
+command line:
+
+```
+java -jar /path/to/google-java-format-1.0-all-deps.jar -i path/to/java/File.java
+```
+
 CSS in Gitiles follows the [SUIT CSS naming conventions]
 (https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md).
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
index 4837671..d570dbc 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
@@ -23,6 +23,7 @@
 import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
 
 import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -53,6 +54,7 @@
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.eclipse.jgit.util.QuotedString;
 import org.eclipse.jgit.util.RawParseUtils;
+import org.eclipse.jgit.util.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -239,6 +241,11 @@
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
 
+    String longStr = req.getParameter("long");
+    boolean includeSizes =
+        (longStr != null)
+            && (longStr.isEmpty() || Boolean.TRUE.equals(StringUtils.toBooleanOrNull(longStr)));
+
     try (RevWalk rw = new RevWalk(repo);
         WalkResult wr = WalkResult.forPath(rw, view)) {
       if (wr == null) {
@@ -247,7 +254,11 @@
       }
       switch (wr.type) {
         case TREE:
-          renderJson(req, res, TreeJsonData.toJsonData(wr.id, wr.tw), TreeJsonData.Tree.class);
+          renderJson(
+              req,
+              res,
+              TreeJsonData.toJsonData(wr.id, wr.tw, includeSizes),
+              TreeJsonData.Tree.class);
           break;
         default:
           res.setStatus(SC_NOT_FOUND);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
index b525453..6fb4a6c 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TreeJsonData.java
@@ -14,11 +14,17 @@
 
 package com.google.gitiles;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import com.google.common.collect.Lists;
 
+import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.treewalk.TreeWalk;
 
 import java.io.IOException;
@@ -35,9 +41,12 @@
     String type;
     String id;
     String name;
+
+    @Nullable String target;
+    @Nullable Long size;
   }
 
-  static Tree toJsonData(ObjectId id, TreeWalk tw) throws IOException {
+  static Tree toJsonData(ObjectId id, TreeWalk tw, boolean includeSizes) throws IOException {
     Tree tree = new Tree();
     tree.id = id.name();
     tree.entries = Lists.newArrayList();
@@ -48,6 +57,15 @@
       e.type = Constants.typeString(mode.getObjectType());
       e.id = tw.getObjectId(0).name();
       e.name = tw.getNameString();
+
+      if (includeSizes) {
+        if ((mode.getBits() & FileMode.TYPE_MASK) == FileMode.TYPE_FILE) {
+          e.size = tw.getObjectReader().getObjectSize(tw.getObjectId(0), Constants.OBJ_BLOB);
+        } else if ((mode.getBits() & FileMode.TYPE_MASK) == FileMode.TYPE_SYMLINK) {
+          e.target =
+              new String(tw.getObjectReader().open(tw.getObjectId(0)).getCachedBytes(), UTF_8);
+        }
+      }
       tree.entries.add(e);
     }
     return tree;
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
index 5842e07..1eac476 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
@@ -224,6 +224,50 @@
   }
 
   @Test
+  public void treeJsonSizes() throws Exception {
+    RevCommit c = repo.parseBody(repo.branch("master").commit().add("baz", "01234567").create());
+
+    Tree tree = buildJson(Tree.class, "/repo/+/master/", "long=1");
+
+    assertThat(tree.id).isEqualTo(c.getTree().name());
+    assertThat(tree.entries).hasSize(1);
+    assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
+    assertThat(tree.entries.get(0).type).isEqualTo("blob");
+    assertThat(tree.entries.get(0).name).isEqualTo("baz");
+    assertThat(tree.entries.get(0).size).isEqualTo(8);
+  }
+
+  @Test
+  public void treeJsonLinkTarget() throws Exception {
+    final ObjectId targetID = repo.blob("target");
+    RevCommit c =
+        repo.parseBody(
+            repo.branch("master")
+                .commit()
+                .edit(
+                    new PathEdit("link") {
+                      @Override
+                      public void apply(DirCacheEntry ent) {
+                        ent.setFileMode(FileMode.SYMLINK);
+                        ent.setObjectId(targetID);
+                      }
+                    })
+                .create());
+
+    Tree tree = buildJson(Tree.class, "/repo/+/master/", "long=1");
+
+    assertThat(tree.id).isEqualTo(c.getTree().name());
+    assertThat(tree.entries).hasSize(1);
+
+    TreeJsonData.Entry e = tree.entries.get(0);
+    assertThat(e.mode).isEqualTo(0120000);
+    assertThat(e.type).isEqualTo("blob");
+    assertThat(e.name).isEqualTo("link");
+    assertThat(e.id).isEqualTo(targetID.name());
+    assertThat(e.target).isEqualTo("target");
+  }
+
+  @Test
   public void treeJson() throws Exception {
     RevCommit c =
         repo.parseBody(