Minimize reading of all refs from disk

When displaying the commit log, all refs was fetch from
the repository for each of the 20 most recent commits
displayed.

By not destroying the Builder objects unneccesarily often
we can cache the refs and reuse them for each commit.

On heavy gits with a lot of refs, we could fetch the page
20 times faster than before.

Change-Id: Ief060002b295abfe0ca01d194504c95502891e39
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
index 733da0a..9e5a9fe 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -56,6 +56,7 @@
 
   private Linkifier linkifier;
   private RevWalk walk;
+  private CommitData.Builder cdb;
   private ArchiveFormat archiveFormat;
 
   CommitSoyData setLinkifier(@Nullable Linkifier linkifier) {
@@ -76,7 +77,11 @@
   Map<String, Object> toSoyData(HttpServletRequest req, RevCommit c, Set<Field> fs,
       DateFormatter df) throws IOException {
     GitilesView view = ViewFilter.getView(req);
-    CommitData cd = new CommitData.Builder()
+    if (cdb == null) {
+      cdb = new CommitData.Builder();
+    }
+
+    CommitData cd = cdb
         .setRevWalk(walk)
         .setArchiveFormat(archiveFormat)
         .build(req, c, fs);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
index 244bbc8..0508561 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -47,6 +47,7 @@
   private final Set<Field> fields;
   private final String pretty;
   private final String variant;
+  private CommitSoyData csd;
 
   public LogSoyData(HttpServletRequest req, GitilesAccess access, String pretty)
       throws IOException {
@@ -97,7 +98,11 @@
 
   private Map<String, Object> toEntrySoyData(Paginator paginator, RevCommit c, DateFormatter df,
       boolean first) throws IOException {
-    Map<String, Object> entry = new CommitSoyData().setRevWalk(paginator.getWalk())
+    if (csd == null) {
+      csd = new CommitSoyData();
+    }
+
+    Map<String, Object> entry = csd.setRevWalk(paginator.getWalk())
         .toSoyData(req, c, fields, df);
     return ImmutableMap.of(
         "firstWithPrevious", first && paginator.getPreviousStart() != null,