diff --git a/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java b/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
index fc6ed6c..66363b7 100644
--- a/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
+++ b/blame-cache/src/main/java/com/google/gitiles/blame/BlameCacheImpl.java
@@ -52,12 +52,13 @@
 
   public static CacheBuilder<Key, List<Region>> weigher(
       CacheBuilder<? super Key, ? super List<Region>> builder) {
-    return builder.weigher(new Weigher<Key, List<Region>>() {
-      @Override
-      public int weigh(Key key, List<Region> value) {
-        return value.size();
-      }
-    });
+    return builder.weigher(
+        new Weigher<Key, List<Region>>() {
+          @Override
+          public int weigh(Key key, List<Region> value) {
+            return value.size();
+          }
+        });
   }
 
   public static class Key {
@@ -81,8 +82,7 @@
     public boolean equals(Object o) {
       if (o instanceof Key) {
         Key k = (Key) o;
-        return Objects.equals(commitId, k.commitId)
-            && Objects.equals(path, k.path);
+        return Objects.equals(commitId, k.commitId) && Objects.equals(path, k.path);
       }
       return false;
     }
@@ -122,8 +122,7 @@
   }
 
   @Override
-  public List<Region> get(Repository repo, ObjectId commitId, String path)
-      throws IOException {
+  public List<Region> get(Repository repo, ObjectId commitId, String path) throws IOException {
     try {
       Key key = new Key(commitId, path);
       return cache.get(key, newLoader(key, repo));
@@ -142,9 +141,8 @@
       // Don't use rename detection, even though BlameGenerator does. It is not
       // possible for a commit to modify a path when not doing rename detection
       // but to not modify the same path when taking renames into account.
-      rw.setTreeFilter(AndTreeFilter.create(
-          PathFilterGroup.createFromStrings(path),
-          TreeFilter.ANY_DIFF));
+      rw.setTreeFilter(
+          AndTreeFilter.create(PathFilterGroup.createFromStrings(path), TreeFilter.ANY_DIFF));
       return rw.next();
     }
   }
@@ -180,12 +178,14 @@
 
       PooledCommit pc = commits.get(commit);
       if (pc == null) {
-        pc = new PooledCommit(commit.copy(),
-            new PersonIdent(
-              strings.intern(author.getName()),
-              strings.intern(author.getEmailAddress()),
-              author.getWhen(),
-              author.getTimeZone()));
+        pc =
+            new PooledCommit(
+                commit.copy(),
+                new PersonIdent(
+                    strings.intern(author.getName()),
+                    strings.intern(author.getEmailAddress()),
+                    author.getWhen(),
+                    author.getTimeZone()));
         commits.put(pc.commit, pc);
       }
       path = strings.intern(path);
diff --git a/blame-cache/src/main/java/com/google/gitiles/blame/Region.java b/blame-cache/src/main/java/com/google/gitiles/blame/Region.java
index d6f928d..fbc9eb4 100644
--- a/blame-cache/src/main/java/com/google/gitiles/blame/Region.java
+++ b/blame-cache/src/main/java/com/google/gitiles/blame/Region.java
@@ -32,9 +32,13 @@
   private transient int start;
 
   public Region(String path, ObjectId commit, PersonIdent author, int start, int end) {
-    checkArgument((path != null && commit != null && author != null)
-        || (path == null && commit == null && author == null),
-        "expected all null or none: %s, %s, %s", path, commit, author);
+    checkArgument(
+        (path != null && commit != null && author != null)
+            || (path == null && commit == null && author == null),
+        "expected all null or none: %s, %s, %s",
+        path,
+        commit,
+        author);
     this.sourcePath = path;
     this.sourceCommit = commit;
     this.sourceAuthor = author;
@@ -82,13 +86,13 @@
       sb.append(sourceCommit.name(), 0, 7)
           .append(' ')
           .append(sourceAuthor.toExternalString())
-          .append(" (").append(sourcePath).append(')');
+          .append(" (")
+          .append(sourcePath)
+          .append(')');
     } else {
       sb.append("<unblamed region>");
     }
-    sb.append(' ')
-        .append("start=").append(start)
-        .append(", count=").append(count);
+    sb.append(' ').append("start=").append(start).append(", count=").append(count);
     return sb.toString();
   }
 }
diff --git a/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java b/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
index ccdbd6c..0a91433 100644
--- a/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
+++ b/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
@@ -79,8 +79,8 @@
     } catch (UnknownHostException e) {
       networkHostName = "127.0.0.1";
     }
-    cfg.setString("gitiles", null, "siteTitle",
-        String.format("Gitiles - %s:%s", networkHostName, cwd));
+    cfg.setString(
+        "gitiles", null, "siteTitle", String.format("Gitiles - %s:%s", networkHostName, cwd));
     cfg.setString("gitiles", null, "canonicalHostName", new File(cwd).getName());
     return cfg;
   }
@@ -100,7 +100,7 @@
     String sourceRoot = System.getProperty(prop);
     if (sourceRoot == null) {
       throw new NoSuchFileException(
-        String.format("Must set system property %s to top of source directory", prop));
+          String.format("Must set system property %s to top of source directory", prop));
     }
     return Paths.get(sourceRoot);
   }
@@ -140,22 +140,21 @@
   }
 
   private Handler appHandler() {
-    DebugRenderer renderer = new DebugRenderer(
-        STATIC_PREFIX,
-        Arrays.asList(cfg.getStringList("gitiles", null, "customTemplates")),
-        sourceRoot.resolve("gitiles-servlet/src/main/resources/com/google/gitiles/templates")
-            .toString(),
-        firstNonNull(cfg.getString("gitiles", null, "siteTitle"), "Gitiles"));
+    DebugRenderer renderer =
+        new DebugRenderer(
+            STATIC_PREFIX,
+            Arrays.asList(cfg.getStringList("gitiles", null, "customTemplates")),
+            sourceRoot
+                .resolve("gitiles-servlet/src/main/resources/com/google/gitiles/templates")
+                .toString(),
+            firstNonNull(cfg.getString("gitiles", null, "siteTitle"), "Gitiles"));
 
     String docRoot = cfg.getString("gitiles", null, "docroot");
     Servlet servlet;
     if (!Strings.isNullOrEmpty(docRoot)) {
       servlet = createRootedDocServlet(renderer, docRoot);
     } else {
-      servlet = new GitilesServlet(
-          cfg,
-          renderer,
-          null, null, null, null, null, null, null);
+      servlet = new GitilesServlet(cfg, renderer, null, null, null, null, null, null, null);
     }
 
     ServletContextHandler handler = new ServletContextHandler();
@@ -165,15 +164,15 @@
   }
 
   private Handler staticHandler() throws IOException {
-    Path staticRoot = sourceRoot.resolve(
-        "gitiles-servlet/src/main/resources/com/google/gitiles/static");
+    Path staticRoot =
+        sourceRoot.resolve("gitiles-servlet/src/main/resources/com/google/gitiles/static");
     ResourceHandler rh = new ResourceHandler();
     try {
       rh.setBaseResource(new FileResource(staticRoot.toUri().toURL()));
     } catch (URISyntaxException e) {
       throw new IOException(e);
     }
-    rh.setWelcomeFiles(new String[]{});
+    rh.setWelcomeFiles(new String[] {});
     rh.setDirectoriesListed(false);
     ContextHandler handler = new ContextHandler("/+static");
     handler.setHandler(rh);
@@ -184,22 +183,20 @@
     File docRepo = new File(docRoot);
     final FileKey repoKey = FileKey.exact(docRepo, FS.DETECTED);
 
-    RepositoryResolver<HttpServletRequest> resolver = new RepositoryResolver<HttpServletRequest>() {
-      @Override
-      public Repository open(HttpServletRequest req, String name)
-          throws RepositoryNotFoundException {
-        try {
-          return RepositoryCache.open(repoKey, true);
-        } catch (IOException e) {
-          throw new RepositoryNotFoundException(repoKey.getFile(), e);
-        }
-      }
-    };
+    RepositoryResolver<HttpServletRequest> resolver =
+        new RepositoryResolver<HttpServletRequest>() {
+          @Override
+          public Repository open(HttpServletRequest req, String name)
+              throws RepositoryNotFoundException {
+            try {
+              return RepositoryCache.open(repoKey, true);
+            } catch (IOException e) {
+              throw new RepositoryNotFoundException(repoKey.getFile(), e);
+            }
+          }
+        };
 
-    return new RootedDocServlet(
-        resolver,
-        new RootedDocAccess(docRepo),
-        renderer);
+    return new RootedDocServlet(resolver, new RootedDocAccess(docRepo), renderer);
   }
 
   private class RootedDocAccess implements GitilesAccess.Factory {
@@ -246,5 +243,4 @@
       };
     }
   }
-
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
index 4fa1693..f2adff3 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
@@ -36,7 +36,7 @@
   @Test
   public void defaultIncludingTimeZone() throws Exception {
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    DateFormatter df = new DateFormatter(Optional.<TimeZone> absent(), DEFAULT);
+    DateFormatter df = new DateFormatter(Optional.<TimeZone>absent(), DEFAULT);
     assertThat(df.format(ident)).isEqualTo("Mon Jan 02 15:04:05 2006 -0700");
   }
 
@@ -57,7 +57,7 @@
   @Test
   public void isoIncludingTimeZone() throws Exception {
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    DateFormatter df = new DateFormatter(Optional.<TimeZone> absent(), ISO);
+    DateFormatter df = new DateFormatter(Optional.<TimeZone>absent(), ISO);
     assertThat(df.format(ident)).isEqualTo("2006-01-02 15:04:05 -0700");
   }
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java
index cfc74ee..620d80a 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/DiffServletTest.java
@@ -45,9 +45,11 @@
 
     String actual = buildHtml("/repo/+diff/" + c2.name() + "^!/foo", false);
 
-    String diffHeader = String.format(
-        "diff --git <a href=\"/b/repo/+/%s/foo\">a/foo</a> <a href=\"/b/repo/+/%s/foo\">b/foo</a>",
-        c1.name(), c2.name());
+    String diffHeader =
+        String.format(
+            "diff --git <a href=\"/b/repo/+/%s/foo\">a/foo</a> <a href=\"/b/repo/+/%s/foo\">b/foo</a>",
+            c1.name(),
+            c2.name());
     assertThat(actual).contains(diffHeader);
   }
 
@@ -94,10 +96,10 @@
   @Test
   public void diffDirectoryText() throws Exception {
     String contents = "contents\n";
-    RevCommit c = repo.update("master", repo.commit()
-        .add("dir/foo", contents)
-        .add("dir/bar", contents)
-        .add("baz", contents));
+    RevCommit c =
+        repo.update(
+            "master",
+            repo.commit().add("dir/foo", contents).add("dir/bar", contents).add("baz", contents));
 
     FakeHttpServletResponse res = buildText("/repo/+diff/" + c.name() + "^!/dir");
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java
index 343b270..b158432 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletRequest.java
@@ -51,11 +51,7 @@
   public static final String SERVLET_PATH = "/b";
 
   public static FakeHttpServletRequest newRequest() {
-    return new FakeHttpServletRequest(
-        URLS.getHostName(null),
-        80,
-        "",
-        SERVLET_PATH);
+    return new FakeHttpServletRequest(URLS.getHostName(null), 80, "", SERVLET_PATH);
   }
 
   public static FakeHttpServletRequest newRequest(DfsRepository repo) {
@@ -75,8 +71,8 @@
   private String servletPath;
   private String path;
 
-  private FakeHttpServletRequest(String hostName, int port, String contextPath,
-      String servletPath) {
+  private FakeHttpServletRequest(
+      String hostName, int port, String contextPath, String servletPath) {
     this.hostName = checkNotNull(hostName, "hostName");
     checkArgument(port > 0);
     this.port = port;
@@ -177,7 +173,8 @@
     for (String entry : Splitter.on('&').split(qs)) {
       List<String> kv = Splitter.on('=').limit(2).splitToList(entry);
       try {
-        params.put(URLDecoder.decode(kv.get(0), UTF_8.name()),
+        params.put(
+            URLDecoder.decode(kv.get(0), UTF_8.name()),
             kv.size() == 2 ? URLDecoder.decode(kv.get(1), UTF_8.name()) : "");
       } catch (UnsupportedEncodingException e) {
         throw new IllegalArgumentException(e);
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java
index 8c596d8..4f50568 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/FakeHttpServletResponse.java
@@ -46,8 +46,7 @@
   private ServletOutputStream outputStream;
   private PrintWriter writer;
 
-  public FakeHttpServletResponse() {
-  }
+  public FakeHttpServletResponse() {}
 
   @Override
   public synchronized void flushBuffer() throws IOException {
@@ -84,13 +83,14 @@
     checkState(writer == null, "getWriter() already called");
     if (outputStream == null) {
       final PrintWriter osWriter = new PrintWriter(actualBody);
-      outputStream = new ServletOutputStream() {
-        @Override
-        public void write(int c) throws IOException {
-          osWriter.write(c);
-          osWriter.flush();
-        }
-      };
+      outputStream =
+          new ServletOutputStream() {
+            @Override
+            public void write(int c) throws IOException {
+              osWriter.write(c);
+              osWriter.flush();
+            }
+          };
     }
     return outputStream;
   }
@@ -126,8 +126,7 @@
 
   @Override
   public void setCharacterEncoding(String name) {
-    checkArgument(UTF_8.equals(Charset.forName(name)),
-        "unsupported charset: %s", name);
+    checkArgument(UTF_8.equals(Charset.forName(name)), "unsupported charset: %s", name);
   }
 
   @Override
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
index 730f18f..59659a2 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/GitilesViewTest.java
@@ -29,17 +29,12 @@
 /** Tests for Gitiles views. */
 @RunWith(JUnit4.class)
 public class GitilesViewTest {
-  private static final GitilesView HOST = GitilesView.hostIndex()
-      .setServletPath("/b")
-      .setHostName("host")
-      .build();
+  private static final GitilesView HOST =
+      GitilesView.hostIndex().setServletPath("/b").setHostName("host").build();
 
   @Test
   public void emptyServletPath() throws Exception {
-    GitilesView view = GitilesView.hostIndex()
-        .setServletPath("")
-        .setHostName("host")
-        .build();
+    GitilesView view = GitilesView.hostIndex().setServletPath("").setHostName("host").build();
     assertThat(view.getServletPath()).isEqualTo("");
     assertThat(view.getType()).isEqualTo(Type.HOST_INDEX);
     assertThat(view.getHostName()).isEqualTo("host");
@@ -49,8 +44,7 @@
     assertThat(HOST.getParameters()).isEmpty();
 
     assertThat(view.toUrl()).isEqualTo("/?format=HTML");
-    assertThat(view.getBreadcrumbs())
-        .containsExactly(breadcrumb("host", "/?format=HTML"));
+    assertThat(view.getBreadcrumbs()).containsExactly(breadcrumb("host", "/?format=HTML"));
   }
 
   @Test
@@ -64,31 +58,23 @@
     assertThat(HOST.getParameters()).isEmpty();
 
     assertThat(HOST.toUrl()).isEqualTo("/b/?format=HTML");
-    assertThat(HOST.getBreadcrumbs())
-        .containsExactly(breadcrumb("host", "/b/?format=HTML"));
+    assertThat(HOST.getBreadcrumbs()).containsExactly(breadcrumb("host", "/b/?format=HTML"));
   }
 
   @Test
   public void hostIndexOneComponentPrefix() throws Exception {
-    GitilesView view = GitilesView.hostIndex()
-        .copyFrom(HOST)
-        .setRepositoryPrefix("foo")
-        .build();
+    GitilesView view = GitilesView.hostIndex().copyFrom(HOST).setRepositoryPrefix("foo").build();
 
     assertThat(view.toUrl()).isEqualTo("/b/foo/");
     assertThat(view.getBreadcrumbs())
-        .containsExactly(
-          breadcrumb("host", "/b/?format=HTML"),
-          breadcrumb("foo", "/b/foo/"))
+        .containsExactly(breadcrumb("host", "/b/?format=HTML"), breadcrumb("foo", "/b/foo/"))
         .inOrder();
   }
 
   @Test
   public void hostIndexTwoComponentPrefix() throws Exception {
-    GitilesView view = GitilesView.hostIndex()
-        .copyFrom(HOST)
-        .setRepositoryPrefix("foo/bar")
-        .build();
+    GitilesView view =
+        GitilesView.hostIndex().copyFrom(HOST).setRepositoryPrefix("foo/bar").build();
 
     assertThat(view.toUrl()).isEqualTo("/b/foo/bar/");
     assertThat(view.getBreadcrumbs())
@@ -101,12 +87,14 @@
 
   @Test
   public void queryParams() throws Exception {
-    GitilesView view = GitilesView.log().copyFrom(HOST)
-        .setRepositoryName("repo")
-        .setRevision(Revision.named("master"))
-        .putParam("foo", "foovalue")
-        .putParam("bar", "barvalue")
-        .build();
+    GitilesView view =
+        GitilesView.log()
+            .copyFrom(HOST)
+            .setRepositoryName("repo")
+            .setRevision(Revision.named("master"))
+            .putParam("foo", "foovalue")
+            .putParam("bar", "barvalue")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.LOG);
@@ -114,10 +102,11 @@
     assertThat(view.getRepositoryName()).isEqualTo("repo");
     assertThat(view.getRevision()).isEqualTo(Revision.named("master"));
     assertThat(view.getPathPart()).isNull();
-    assertThat(view.getParameters()).containsExactlyEntriesIn(
-        ImmutableListMultimap.of(
-            "foo", "foovalue",
-            "bar", "barvalue"));
+    assertThat(view.getParameters())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                "foo", "foovalue",
+                "bar", "barvalue"));
 
     assertThat(view.toUrl()).isEqualTo("/b/repo/+log/master?foo=foovalue&bar=barvalue");
     assertThat(view.getBreadcrumbs())
@@ -130,11 +119,13 @@
 
   @Test
   public void queryParamsCopiedOnlyOnSameType() throws Exception {
-    GitilesView view = GitilesView.repositoryIndex().copyFrom(HOST)
-        .setRepositoryName("repo")
-        .putParam("foo", "foovalue")
-        .putParam("bar", "barvalue")
-        .build();
+    GitilesView view =
+        GitilesView.repositoryIndex()
+            .copyFrom(HOST)
+            .setRepositoryName("repo")
+            .putParam("foo", "foovalue")
+            .putParam("bar", "barvalue")
+            .build();
     assertThat(view.getParameters()).isNotEmpty();
     assertThat(GitilesView.repositoryIndex().copyFrom(view).build().getParameters())
         .isEqualTo(view.getParameters());
@@ -143,10 +134,8 @@
 
   @Test
   public void repositoryIndex() throws Exception {
-    GitilesView view = GitilesView.repositoryIndex()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .build();
+    GitilesView view =
+        GitilesView.repositoryIndex().copyFrom(HOST).setRepositoryName("foo/bar").build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.REPOSITORY_INDEX);
@@ -167,10 +156,7 @@
 
   @Test
   public void refs() throws Exception {
-    GitilesView view = GitilesView.refs()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .build();
+    GitilesView view = GitilesView.refs().copyFrom(HOST).setRepositoryName("foo/bar").build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.REFS);
@@ -192,11 +178,12 @@
   @Test
   public void refWithRevision() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.revision()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .build();
+    GitilesView view =
+        GitilesView.revision()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.REVISION);
@@ -219,11 +206,12 @@
 
   @Test
   public void describe() throws Exception {
-    GitilesView view = GitilesView.describe()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setPathPart("deadbeef")
-        .build();
+    GitilesView view =
+        GitilesView.describe()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setPathPart("deadbeef")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.DESCRIBE);
@@ -237,12 +225,13 @@
   @Test
   public void noPathComponents() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.path()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/")
-        .build();
+    GitilesView view =
+        GitilesView.path()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.PATH);
@@ -267,12 +256,13 @@
   @Test
   public void onePathComponent() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.path()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/file")
-        .build();
+    GitilesView view =
+        GitilesView.path()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.PATH);
@@ -298,12 +288,13 @@
   @Test
   public void oneDocFileAuto() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.doc()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/README.md")
-        .build();
+    GitilesView view =
+        GitilesView.doc()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/README.md")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.DOC);
@@ -319,12 +310,13 @@
   @Test
   public void oneDocTree() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.doc()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/docs/")
-        .build();
+    GitilesView view =
+        GitilesView.doc()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/docs/")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.DOC);
@@ -340,12 +332,13 @@
   @Test
   public void showMarkdown() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.show()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/README.md")
-        .build();
+    GitilesView view =
+        GitilesView.show()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/README.md")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.SHOW);
@@ -361,11 +354,12 @@
   @Test
   public void rootedDoc() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.rootedDoc()
-        .copyFrom(HOST)
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/docs/")
-        .build();
+    GitilesView view =
+        GitilesView.rootedDoc()
+            .copyFrom(HOST)
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/docs/")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.ROOTED_DOC);
@@ -380,12 +374,13 @@
   @Test
   public void multiplePathComponents() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.path()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/path/to/a/file")
-        .build();
+    GitilesView view =
+        GitilesView.path()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/path/to/a/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.PATH);
@@ -415,13 +410,14 @@
   public void diffAgainstFirstParent() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
     ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
-    GitilesView view = GitilesView.diff()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setOldRevision(Revision.unpeeled("master^", parent))
-        .setPathPart("/path/to/a/file")
-        .build();
+    GitilesView view =
+        GitilesView.diff()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setOldRevision(Revision.unpeeled("master^", parent))
+            .setPathPart("/path/to/a/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.DIFF);
@@ -451,12 +447,13 @@
   @Test
   public void diffAgainstEmptyRevision() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.diff()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/path/to/a/file")
-        .build();
+    GitilesView view =
+        GitilesView.diff()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/path/to/a/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.DIFF);
@@ -487,13 +484,14 @@
   public void diffAgainstOther() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
     ObjectId other = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
-    GitilesView view = GitilesView.diff()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setOldRevision(Revision.unpeeled("efab5678", other))
-        .setPathPart("/path/to/a/file")
-        .build();
+    GitilesView view =
+        GitilesView.diff()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setOldRevision(Revision.unpeeled("efab5678", other))
+            .setPathPart("/path/to/a/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.DIFF);
@@ -523,11 +521,12 @@
   @Test
   public void branchLogWithoutPath() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.log()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .build();
+    GitilesView view =
+        GitilesView.log()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.LOG);
@@ -552,11 +551,12 @@
   @Test
   public void idLogWithoutPath() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.log()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("abcd1234", id))
-        .build();
+    GitilesView view =
+        GitilesView.log()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("abcd1234", id))
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.LOG);
@@ -581,12 +581,13 @@
   @Test
   public void logWithoutOldRevision() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.log()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/path/to/a/file")
-        .build();
+    GitilesView view =
+        GitilesView.log()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/path/to/a/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.LOG);
@@ -616,13 +617,14 @@
   public void logWithOldRevision() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
     ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
-    GitilesView view = GitilesView.log()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setOldRevision(Revision.unpeeled("master^", parent))
-        .setPathPart("/path/to/a/file")
-        .build();
+    GitilesView view =
+        GitilesView.log()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setOldRevision(Revision.unpeeled("master^", parent))
+            .setPathPart("/path/to/a/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.LOG);
@@ -650,10 +652,7 @@
 
   @Test
   public void logWithNoRevision() throws Exception {
-    GitilesView view = GitilesView.log()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .build();
+    GitilesView view = GitilesView.log().copyFrom(HOST).setRepositoryName("foo/bar").build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.LOG);
@@ -676,12 +675,13 @@
   @Test
   public void archiveWithNoPath() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.archive()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setExtension(".tar.bz2")
-        .build();
+    GitilesView view =
+        GitilesView.archive()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setExtension(".tar.bz2")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.ARCHIVE);
@@ -698,13 +698,14 @@
   @Test
   public void archiveWithPath() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.archive()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/path/to/a/dir")
-        .setExtension(".tar.bz2")
-        .build();
+    GitilesView view =
+        GitilesView.archive()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/path/to/a/dir")
+            .setExtension(".tar.bz2")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.ARCHIVE);
@@ -721,12 +722,13 @@
   @Test
   public void blame() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.blame()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/dir/file")
-        .build();
+    GitilesView view =
+        GitilesView.blame()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/dir/file")
+            .build();
 
     assertThat(view.getServletPath()).isEqualTo("/b");
     assertThat(view.getType()).isEqualTo(Type.BLAME);
@@ -755,15 +757,16 @@
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
     ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
     // Some of these values are not valid for Git, but check them anyway.
-    GitilesView view = GitilesView.log()
-        .copyFrom(HOST)
-        .setRepositoryName("foo?bar")
-        .setRevision(Revision.unpeeled("ba/d#name", id))
-        .setOldRevision(Revision.unpeeled("other\"na/me", parent))
-        .setPathPart("we ird/pa'th/name")
-        .putParam("k e y", "val/ue")
-        .setAnchor("anc#hor")
-        .build();
+    GitilesView view =
+        GitilesView.log()
+            .copyFrom(HOST)
+            .setRepositoryName("foo?bar")
+            .setRevision(Revision.unpeeled("ba/d#name", id))
+            .setOldRevision(Revision.unpeeled("other\"na/me", parent))
+            .setPathPart("we ird/pa'th/name")
+            .putParam("k e y", "val/ue")
+            .setAnchor("anc#hor")
+            .build();
 
     // Fields returned by getters are not escaped.
     assertThat(view.getServletPath()).isEqualTo("/b");
@@ -776,36 +779,39 @@
     assertThat(view.getOldRevision().getName()).isEqualTo("other\"na/me");
     assertThat(view.getPathPart()).isEqualTo("we ird/pa'th/name");
     assertThat(view.getParameters())
-        .isEqualTo(ImmutableListMultimap.<String, String> of("k e y", "val/ue"));
+        .isEqualTo(ImmutableListMultimap.<String, String>of("k e y", "val/ue"));
 
     String qs = "?k+e+y=val%2Fue";
-    assertThat(view.toUrl()).isEqualTo(
-        "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name" + qs + "#anc%23hor");
+    assertThat(view.toUrl())
+        .isEqualTo(
+            "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name"
+                + qs
+                + "#anc%23hor");
     assertThat(view.getBreadcrumbs())
         .containsExactly(
             // Names are not escaped (auto-escaped by Soy) but values are.
             breadcrumb("host", "/b/?format=HTML"),
             breadcrumb("foo?bar", "/b/foo%3Fbar/"),
-            breadcrumb("other\"na/me..ba/d#name",
-              "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name" + qs),
-            breadcrumb("we ird",
-              "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird" + qs),
-            breadcrumb("pa'th",
-              "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th" + qs),
-            breadcrumb("name",
-              "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name" + qs))
+            breadcrumb(
+                "other\"na/me..ba/d#name", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name" + qs),
+            breadcrumb("we ird", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird" + qs),
+            breadcrumb(
+                "pa'th", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th" + qs),
+            breadcrumb(
+                "name", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name" + qs))
         .inOrder();
   }
 
   @Test
   public void breadcrumbsHasSingleTree() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.path()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("/path/to/a/file")
-        .build();
+    GitilesView view =
+        GitilesView.path()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("/path/to/a/file")
+            .build();
 
     assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/path/to/a/file");
     assertThat(view.getBreadcrumbs(ImmutableList.of(false, true, true)))
@@ -837,15 +843,16 @@
   @Test
   public void breadcrumbsHasSingleTreeRootPath() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.path()
-        .copyFrom(HOST)
-        .setRepositoryName("foo/bar")
-        .setRevision(Revision.unpeeled("master", id))
-        .setPathPart("")
-        .build();
+    GitilesView view =
+        GitilesView.path()
+            .copyFrom(HOST)
+            .setRepositoryName("foo/bar")
+            .setRevision(Revision.unpeeled("master", id))
+            .setPathPart("")
+            .build();
 
     assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/");
-    assertThat(view.getBreadcrumbs(ImmutableList.<Boolean> of()))
+    assertThat(view.getBreadcrumbs(ImmutableList.<Boolean>of()))
         .containsExactly(
             breadcrumb("host", "/b/?format=HTML"),
             breadcrumb("foo", "/b/foo/"),
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java
index b8d4e82..0a502b0 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/GitwebRedirectFilterTest.java
@@ -43,8 +43,9 @@
 
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription("test")));
+    repo =
+        new TestRepository<DfsRepository>(
+            new InMemoryRepository(new DfsRepositoryDescription("test")));
     servlet = TestGitilesServlet.create(repo);
   }
 
@@ -71,10 +72,7 @@
   @Test
   public void hostIndex() throws Exception {
     assertRedirectsTo(
-        GitilesView.hostIndex()
-            .setHostName(HOST_NAME)
-            .setServletPath(SERVLET_PATH)
-            .toUrl(),
+        GitilesView.hostIndex().setHostName(HOST_NAME).setServletPath(SERVLET_PATH).toUrl(),
         newRequest("a=project_index"));
   }
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
index f98e7bf..07b8585 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
@@ -46,8 +46,9 @@
   @Override
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription(NAME)));
+    repo =
+        new TestRepository<DfsRepository>(
+            new InMemoryRepository(new DfsRepositoryDescription(NAME)));
     servlet = TestGitilesServlet.create(repo);
   }
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
index 5497291..f6b16d9 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
@@ -43,12 +43,10 @@
     Config config = new Config();
     Linkifier l = new Linkifier(TestGitilesUrls.URLS, config);
     assertThat(l.linkify(REQ, "http://my/url"))
-        .containsExactly(
-            ImmutableMap.of("text", "http://my/url", "url", "http://my/url"))
+        .containsExactly(ImmutableMap.of("text", "http://my/url", "url", "http://my/url"))
         .inOrder();
     assertThat(l.linkify(REQ, "https://my/url"))
-        .containsExactly(
-            ImmutableMap.of("text", "https://my/url", "url", "https://my/url"))
+        .containsExactly(ImmutableMap.of("text", "https://my/url", "url", "https://my/url"))
         .inOrder();
     assertThat(l.linkify(REQ, "foo http://my/url bar"))
         .containsExactly(
@@ -69,33 +67,33 @@
   @Test
   public void linkifyMessageChangeIdNoGerrit() throws Exception {
     Config config = new Config();
-    Linkifier l = new Linkifier(new GitilesUrls() {
-      @Override
-      public String getBaseGerritUrl(HttpServletRequest req) {
-        return null;
-      }
+    Linkifier l =
+        new Linkifier(
+            new GitilesUrls() {
+              @Override
+              public String getBaseGerritUrl(HttpServletRequest req) {
+                return null;
+              }
 
-      @Override
-      public String getHostName(HttpServletRequest req) {
-        throw new UnsupportedOperationException();
-      }
+              @Override
+              public String getHostName(HttpServletRequest req) {
+                throw new UnsupportedOperationException();
+              }
 
-      @Override
-      public String getBaseGitUrl(HttpServletRequest req) {
-        throw new UnsupportedOperationException();
-      }
-    }, config);
+              @Override
+              public String getBaseGitUrl(HttpServletRequest req) {
+                throw new UnsupportedOperationException();
+              }
+            },
+            config);
     assertThat(l.linkify(REQ, "I0123456789"))
-        .containsExactly(
-            ImmutableMap.of("text", "I0123456789"))
+        .containsExactly(ImmutableMap.of("text", "I0123456789"))
         .inOrder();
     assertThat(l.linkify(REQ, "Change-Id: I0123456789"))
-        .containsExactly(
-            ImmutableMap.of("text", "Change-Id: I0123456789"))
+        .containsExactly(ImmutableMap.of("text", "Change-Id: I0123456789"))
         .inOrder();
     assertThat(l.linkify(REQ, "Change-Id: I0123456789 does not exist"))
-        .containsExactly(
-            ImmutableMap.of("text", "Change-Id: I0123456789 does not exist"))
+        .containsExactly(ImmutableMap.of("text", "Change-Id: I0123456789 does not exist"))
         .inOrder();
   }
 
@@ -105,20 +103,20 @@
     Linkifier l = new Linkifier(TestGitilesUrls.URLS, config);
     assertThat(l.linkify(REQ, "I0123456789"))
         .containsExactly(
-            ImmutableMap.of("text", "I0123456789",
-              "url", "http://test-host-review/foo/#/q/I0123456789,n,z"))
+            ImmutableMap.of(
+                "text", "I0123456789", "url", "http://test-host-review/foo/#/q/I0123456789,n,z"))
         .inOrder();
     assertThat(l.linkify(REQ, "Change-Id: I0123456789"))
         .containsExactly(
             ImmutableMap.of("text", "Change-Id: "),
-            ImmutableMap.of("text", "I0123456789",
-              "url", "http://test-host-review/foo/#/q/I0123456789,n,z"))
+            ImmutableMap.of(
+                "text", "I0123456789", "url", "http://test-host-review/foo/#/q/I0123456789,n,z"))
         .inOrder();
     assertThat(l.linkify(REQ, "Change-Id: I0123456789 exists"))
         .containsExactly(
             ImmutableMap.of("text", "Change-Id: "),
-            ImmutableMap.of("text", "I0123456789",
-              "url", "http://test-host-review/foo/#/q/I0123456789,n,z"),
+            ImmutableMap.of(
+                "text", "I0123456789", "url", "http://test-host-review/foo/#/q/I0123456789,n,z"),
             ImmutableMap.of("text", " exists"))
         .inOrder();
   }
@@ -147,11 +145,11 @@
     Linkifier l = new Linkifier(TestGitilesUrls.URLS, config);
     assertThat(l.linkify(REQ, "http://my/url/I0123456789 is not change I0123456789"))
         .containsExactly(
-            ImmutableMap.of("text", "http://my/url/I0123456789",
-              "url", "http://my/url/I0123456789"),
+            ImmutableMap.of(
+                "text", "http://my/url/I0123456789", "url", "http://my/url/I0123456789"),
             ImmutableMap.of("text", " is not change "),
-            ImmutableMap.of("text", "I0123456789",
-              "url", "http://test-host-review/foo/#/q/I0123456789,n,z"))
+            ImmutableMap.of(
+                "text", "I0123456789", "url", "http://test-host-review/foo/#/q/I0123456789,n,z"))
         .inOrder();
   }
 
@@ -160,13 +158,12 @@
     Config config = new Config();
     Linkifier l = new Linkifier(TestGitilesUrls.URLS, config);
     assertThat(l.linkify(REQ, "http://my/url?a&b"))
-        .containsExactly(
-            ImmutableMap.of("text", "http://my/url?a&b", "url", "http://my/url?a&b"))
+        .containsExactly(ImmutableMap.of("text", "http://my/url?a&b", "url", "http://my/url?a&b"))
         .inOrder();
     assertThat(l.linkify(REQ, "http://weird/htmlified/?url&lt;p&rt;"))
         .containsExactly(
-            ImmutableMap.of("text", "http://weird/htmlified/?url",
-              "url", "http://weird/htmlified/?url"),
+            ImmutableMap.of(
+                "text", "http://weird/htmlified/?url", "url", "http://weird/htmlified/?url"),
             ImmutableMap.of("text", "&lt;p&rt;"))
         .inOrder();
   }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
index 2eadf54..5d1d1f6 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
@@ -71,15 +71,8 @@
   @Test
   public void follow() throws Exception {
     String contents = "contents";
-    RevCommit c1 = repo.branch("master")
-        .commit()
-        .add("foo", contents)
-        .create();
-    RevCommit c2 = repo.branch("master")
-        .commit()
-        .rm("foo")
-        .add("bar", contents)
-        .create();
+    RevCommit c1 = repo.branch("master").commit().add("foo", contents).create();
+    RevCommit c2 = repo.branch("master").commit().rm("foo").add("bar", contents).create();
     repo.getRevWalk().parseBody(c1);
     repo.getRevWalk().parseBody(c2);
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
index 2a08ab9..3328b4c 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/PaginatorTest.java
@@ -41,8 +41,9 @@
 
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription("test")));
+    repo =
+        new TestRepository<DfsRepository>(
+            new InMemoryRepository(new DfsRepositoryDescription("test")));
     walk = new RevWalk(repo.getRepository());
   }
 
@@ -66,12 +67,7 @@
     List<RevCommit> commits = linearCommits(3);
     walk.markStart(commits.get(2));
     Paginator p = new Paginator(walk, 10, null);
-    assertThat(p)
-        .containsExactly(
-            commits.get(2),
-            commits.get(1),
-            commits.get(0))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(2), commits.get(1), commits.get(0)).inOrder();
     assertThat(p.getPreviousStart()).isNull();
     assertThat(p.getNextStart()).isNull();
   }
@@ -81,12 +77,7 @@
     List<RevCommit> commits = linearCommits(3);
     walk.markStart(commits.get(2));
     Paginator p = new Paginator(walk, 3, null);
-    assertThat(p)
-        .containsExactly(
-            commits.get(2),
-            commits.get(1),
-            commits.get(0))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(2), commits.get(1), commits.get(0)).inOrder();
     assertThat(p.getPreviousStart()).isNull();
     assertThat(p.getNextStart()).isNull();
   }
@@ -96,12 +87,7 @@
     List<RevCommit> commits = linearCommits(5);
     walk.markStart(commits.get(4));
     Paginator p = new Paginator(walk, 3, null);
-    assertThat(p)
-        .containsExactly(
-            commits.get(4),
-            commits.get(3),
-            commits.get(2))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(4), commits.get(3), commits.get(2)).inOrder();
     assertThat(p.getPreviousStart()).isNull();
     assertThat(p.getNextStart()).isEqualTo(commits.get(1));
   }
@@ -111,12 +97,7 @@
     List<RevCommit> commits = linearCommits(10);
     walk.markStart(commits.get(9));
     Paginator p = new Paginator(walk, 3, commits.get(9));
-    assertThat(p)
-        .containsExactly(
-              commits.get(9),
-              commits.get(8),
-              commits.get(7))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(9), commits.get(8), commits.get(7)).inOrder();
     assertThat(p.getPreviousStart()).isNull();
     assertThat(p.getNextStart()).isEqualTo(commits.get(6));
   }
@@ -126,12 +107,7 @@
     List<RevCommit> commits = linearCommits(10);
     walk.markStart(commits.get(9));
     Paginator p = new Paginator(walk, 3, null);
-    assertThat(p)
-        .containsExactly(
-              commits.get(9),
-              commits.get(8),
-              commits.get(7))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(9), commits.get(8), commits.get(7)).inOrder();
     assertThat(p.getPreviousStart()).isNull();
     assertThat(p.getNextStart()).isEqualTo(commits.get(6));
   }
@@ -141,12 +117,7 @@
     List<RevCommit> commits = linearCommits(10);
     walk.markStart(commits.get(9));
     Paginator p = new Paginator(walk, 3, commits.get(8));
-    assertThat(p)
-        .containsExactly(
-              commits.get(8),
-              commits.get(7),
-              commits.get(6))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(8), commits.get(7), commits.get(6)).inOrder();
     assertThat(p.getPreviousStart()).isEqualTo(commits.get(9));
     assertThat(p.getNextStart()).isEqualTo(commits.get(5));
   }
@@ -156,12 +127,7 @@
     List<RevCommit> commits = linearCommits(10);
     walk.markStart(commits.get(9));
     Paginator p = new Paginator(walk, 3, commits.get(7));
-    assertThat(p)
-        .containsExactly(
-              commits.get(7),
-              commits.get(6),
-              commits.get(5))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(7), commits.get(6), commits.get(5)).inOrder();
     assertThat(p.getPreviousStart()).isEqualTo(commits.get(9));
     assertThat(p.getNextStart()).isEqualTo(commits.get(4));
   }
@@ -171,12 +137,7 @@
     List<RevCommit> commits = linearCommits(10);
     walk.markStart(commits.get(9));
     Paginator p = new Paginator(walk, 3, commits.get(2));
-    assertThat(p)
-        .containsExactly(
-              commits.get(2),
-              commits.get(1),
-              commits.get(0))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(2), commits.get(1), commits.get(0)).inOrder();
     assertThat(p.getPreviousStart()).isEqualTo(commits.get(5));
     assertThat(p.getNextStart()).isNull();
   }
@@ -186,11 +147,7 @@
     List<RevCommit> commits = linearCommits(10);
     walk.markStart(commits.get(9));
     Paginator p = new Paginator(walk, 3, commits.get(1));
-    assertThat(p)
-        .containsExactly(
-              commits.get(1),
-              commits.get(0))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(1), commits.get(0)).inOrder();
     assertThat(p.getPreviousStart()).isEqualTo(commits.get(4));
     assertThat(p.getNextStart()).isNull();
   }
@@ -200,11 +157,7 @@
     List<RevCommit> commits = linearCommits(10);
     walk.markStart(commits.get(9));
     Paginator p = new Paginator(walk, 5, commits.get(1));
-    assertThat(p)
-        .containsExactly(
-              commits.get(1),
-              commits.get(0))
-        .inOrder();
+    assertThat(p).containsExactly(commits.get(1), commits.get(0)).inOrder();
     assertThat(p.getPreviousStart()).isEqualTo(commits.get(6));
     assertThat(p.getNextStart()).isNull();
   }
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 144e311..5842e07 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
@@ -53,7 +53,8 @@
 
   @Test
   public void subTreeHtml() throws Exception {
-    repo.branch("master").commit()
+    repo.branch("master")
+        .commit()
         .add("foo/bar", "bar contents")
         .add("baz", "baz contents")
         .create();
@@ -102,14 +103,18 @@
   @Test
   public void symlinkHtml() throws Exception {
     final RevBlob link = repo.blob("foo");
-    repo.branch("master").commit().add("foo", "contents")
-      .edit(new PathEdit("bar") {
-        @Override
-        public void apply(DirCacheEntry ent) {
-          ent.setFileMode(FileMode.SYMLINK);
-          ent.setObjectId(link);
-        }
-      }).create();
+    repo.branch("master")
+        .commit()
+        .add("foo", "contents")
+        .edit(
+            new PathEdit("bar") {
+              @Override
+              public void apply(DirCacheEntry ent) {
+                ent.setFileMode(FileMode.SYMLINK);
+                ent.setObjectId(link);
+              }
+            })
+        .create();
 
     Map<String, ?> data = buildData("/repo/+/master/bar");
     assertThat(data).containsEntry("type", "SYMLINK");
@@ -118,18 +123,23 @@
 
   @Test
   public void gitlinkHtml() throws Exception {
-    String gitmodules = "[submodule \"gitiles\"]\n"
-      + "  path = gitiles\n"
-      + "  url = https://gerrit.googlesource.com/gitiles\n";
+    String gitmodules =
+        "[submodule \"gitiles\"]\n"
+            + "  path = gitiles\n"
+            + "  url = https://gerrit.googlesource.com/gitiles\n";
     final String gitilesSha = "2b2f34bba3c2be7e2506ce6b1f040949da350cf9";
-    repo.branch("master").commit().add(".gitmodules", gitmodules)
-        .edit(new PathEdit("gitiles") {
-          @Override
-          public void apply(DirCacheEntry ent) {
-            ent.setFileMode(FileMode.GITLINK);
-            ent.setObjectId(ObjectId.fromString(gitilesSha));
-          }
-        }).create();
+    repo.branch("master")
+        .commit()
+        .add(".gitmodules", gitmodules)
+        .edit(
+            new PathEdit("gitiles") {
+              @Override
+              public void apply(DirCacheEntry ent) {
+                ent.setFileMode(FileMode.GITLINK);
+                ent.setObjectId(ObjectId.fromString(gitilesSha));
+              }
+            })
+        .create();
 
     Map<String, ?> data = buildData("/repo/+/master/gitiles");
     assertThat(data).containsEntry("type", "GITLINK");
@@ -150,14 +160,17 @@
   @Test
   public void symlinkText() throws Exception {
     final RevBlob link = repo.blob("foo");
-    repo.branch("master").commit()
-        .edit(new PathEdit("baz") {
-          @Override
-          public void apply(DirCacheEntry ent) {
-            ent.setFileMode(FileMode.SYMLINK);
-            ent.setObjectId(link);
-          }
-        }).create();
+    repo.branch("master")
+        .commit()
+        .edit(
+            new PathEdit("baz") {
+              @Override
+              public void apply(DirCacheEntry ent) {
+                ent.setFileMode(FileMode.SYMLINK);
+                ent.setObjectId(link);
+              }
+            })
+        .create();
     String text = buildBlob("/repo/+/master/baz", "120000");
     assertThat(text).isEqualTo("foo");
   }
@@ -187,20 +200,24 @@
 
   @Test
   public void nonBlobText() throws Exception {
-    String gitmodules = "[submodule \"gitiles\"]\n"
-      + "  path = gitiles\n"
-      + "  url = https://gerrit.googlesource.com/gitiles\n";
+    String gitmodules =
+        "[submodule \"gitiles\"]\n"
+            + "  path = gitiles\n"
+            + "  url = https://gerrit.googlesource.com/gitiles\n";
     final String gitilesSha = "2b2f34bba3c2be7e2506ce6b1f040949da350cf9";
-    repo.branch("master").commit()
+    repo.branch("master")
+        .commit()
         .add("foo/bar", "contents")
         .add(".gitmodules", gitmodules)
-        .edit(new PathEdit("gitiles") {
-          @Override
-          public void apply(DirCacheEntry ent) {
-            ent.setFileMode(FileMode.GITLINK);
-            ent.setObjectId(ObjectId.fromString(gitilesSha));
-          }
-        }).create();
+        .edit(
+            new PathEdit("gitiles") {
+              @Override
+              public void apply(DirCacheEntry ent) {
+                ent.setFileMode(FileMode.GITLINK);
+                ent.setObjectId(ObjectId.fromString(gitilesSha));
+              }
+            })
+        .create();
 
     assertNotFound("/repo/+/master/nonexistent", "format=text");
     assertNotFound("/repo/+/master/gitiles", "format=text");
@@ -208,10 +225,13 @@
 
   @Test
   public void treeJson() throws Exception {
-    RevCommit c = repo.parseBody(repo.branch("master").commit()
-        .add("foo/bar", "bar contents")
-        .add("baz", "baz contents")
-        .create());
+    RevCommit c =
+        repo.parseBody(
+            repo.branch("master")
+                .commit()
+                .add("foo/bar", "bar contents")
+                .add("baz", "baz contents")
+                .create());
 
     Tree tree = buildJson(Tree.class, "/repo/+/master/");
     assertThat(tree.id).isEqualTo(c.getTree().name());
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
index c0455fa..bd73242 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
@@ -57,8 +57,9 @@
     repo.branch(evilRefName).commit().create();
 
     FakeHttpServletResponse res = buildText("/repo/+refs/evil");
-    assertThat(res.getActualBodyString()).isEqualTo(
-        id(evilRefName) + " refs/evil/&lt;script&gt;window.close();&lt;/script&gt;/&amp;foo\n");
+    assertThat(res.getActualBodyString())
+        .isEqualTo(
+            id(evilRefName) + " refs/evil/&lt;script&gt;window.close();&lt;/script&gt;/&amp;foo\n");
   }
 
   @Test
@@ -66,13 +67,20 @@
     setUpSimpleRefs();
     FakeHttpServletResponse res = buildText("/repo/+refs");
 
-    assertThat(res.getActualBodyString()).isEqualTo(
-        id("HEAD") + " HEAD\n"
-        + id("refs/heads/branch") + " refs/heads/branch\n"
-        + id("refs/heads/master") + " refs/heads/master\n"
-        + id("refs/tags/atag") + " refs/tags/atag\n"
-        + peeled("refs/tags/atag") + " refs/tags/atag^{}\n"
-        + id("refs/tags/ctag") + " refs/tags/ctag\n");
+    assertThat(res.getActualBodyString())
+        .isEqualTo(
+            id("HEAD")
+                + " HEAD\n"
+                + id("refs/heads/branch")
+                + " refs/heads/branch\n"
+                + id("refs/heads/master")
+                + " refs/heads/master\n"
+                + id("refs/tags/atag")
+                + " refs/tags/atag\n"
+                + peeled("refs/tags/atag")
+                + " refs/tags/atag^{}\n"
+                + id("refs/tags/ctag")
+                + " refs/tags/ctag\n");
   }
 
   @Test
@@ -80,13 +88,20 @@
     setUpSimpleRefs();
     FakeHttpServletResponse res = buildText("/repo/+refs/");
 
-    assertThat(res.getActualBodyString()).isEqualTo(
-        id("HEAD") + " HEAD\n"
-        + id("refs/heads/branch") + " refs/heads/branch\n"
-        + id("refs/heads/master") + " refs/heads/master\n"
-        + id("refs/tags/atag") + " refs/tags/atag\n"
-        + peeled("refs/tags/atag") + " refs/tags/atag^{}\n"
-        + id("refs/tags/ctag") + " refs/tags/ctag\n");
+    assertThat(res.getActualBodyString())
+        .isEqualTo(
+            id("HEAD")
+                + " HEAD\n"
+                + id("refs/heads/branch")
+                + " refs/heads/branch\n"
+                + id("refs/heads/master")
+                + " refs/heads/master\n"
+                + id("refs/tags/atag")
+                + " refs/tags/atag\n"
+                + peeled("refs/tags/atag")
+                + " refs/tags/atag^{}\n"
+                + id("refs/tags/ctag")
+                + " refs/tags/ctag\n");
   }
 
   @Test
@@ -94,9 +109,12 @@
     setUpSimpleRefs();
     FakeHttpServletResponse res = buildText("/repo/+refs/heads");
 
-    assertThat(res.getActualBodyString()).isEqualTo(
-        id("refs/heads/branch") + " refs/heads/branch\n"
-        + id("refs/heads/master") + " refs/heads/master\n");
+    assertThat(res.getActualBodyString())
+        .isEqualTo(
+            id("refs/heads/branch")
+                + " refs/heads/branch\n"
+                + id("refs/heads/master")
+                + " refs/heads/master\n");
   }
 
   @Test
@@ -104,9 +122,12 @@
     setUpSimpleRefs();
     FakeHttpServletResponse res = buildText("/repo/+refs/heads/");
 
-    assertThat(res.getActualBodyString()).isEqualTo(
-        id("refs/heads/branch") + " refs/heads/branch\n"
-        + id("refs/heads/master") + " refs/heads/master\n");
+    assertThat(res.getActualBodyString())
+        .isEqualTo(
+            id("refs/heads/branch")
+                + " refs/heads/branch\n"
+                + id("refs/heads/master")
+                + " refs/heads/master\n");
   }
 
   @Test
@@ -123,8 +144,8 @@
     setUpSimpleRefs();
     FakeHttpServletResponse res = buildText("/repo/+refs/heads/master");
 
-    assertThat(res.getActualBodyString()).isEqualTo(
-        id("refs/heads/master") + " refs/heads/master\n");
+    assertThat(res.getActualBodyString())
+        .isEqualTo(id("refs/heads/master") + " refs/heads/master\n");
   }
 
   @Test
@@ -132,9 +153,12 @@
     setUpSimpleRefs();
     FakeHttpServletResponse res = buildText("/repo/+refs/tags/atag");
 
-    assertThat(res.getActualBodyString()).isEqualTo(
-        id("refs/tags/atag") + " refs/tags/atag\n"
-        + peeled("refs/tags/atag") + " refs/tags/atag^{}\n");
+    assertThat(res.getActualBodyString())
+        .isEqualTo(
+            id("refs/tags/atag")
+                + " refs/tags/atag\n"
+                + peeled("refs/tags/atag")
+                + " refs/tags/atag^{}\n");
   }
 
   @Test
@@ -144,11 +168,7 @@
     List<String> keys = ImmutableList.copyOf(result.keySet());
     assertThat(keys)
         .containsExactly(
-            "HEAD",
-            "refs/heads/branch",
-            "refs/heads/master",
-            "refs/tags/atag",
-            "refs/tags/ctag")
+            "HEAD", "refs/heads/branch", "refs/heads/master", "refs/tags/atag", "refs/tags/ctag")
         .inOrder();
 
     RefJsonData head = result.get(keys.get(0));
@@ -182,11 +202,7 @@
     setUpSimpleRefs();
     Map<String, RefJsonData> result = buildRefJson("/repo/+refs/heads");
     List<String> keys = ImmutableList.copyOf(result.keySet());
-    assertThat(keys)
-        .containsExactly(
-            "branch",
-            "master")
-        .inOrder();
+    assertThat(keys).containsExactly("branch", "master").inOrder();
 
     RefJsonData branch = result.get(keys.get(0));
     assertThat(branch.value).isEqualTo(id("refs/heads/branch"));
@@ -217,14 +233,9 @@
     repo.branch("refs/nope/quux").commit().create();
 
     assertThat(buildBranchesSoyData())
-        .containsExactly(
-            ref("/b/test/+/bar", "bar"),
-            ref("/b/test/+/foo", "foo"))
+        .containsExactly(ref("/b/test/+/bar", "bar"), ref("/b/test/+/foo", "foo"))
         .inOrder();
-    assertThat(buildTagsSoyData())
-        .containsExactly(
-            ref("/b/test/+/baz", "baz"))
-        .inOrder();
+    assertThat(buildTagsSoyData()).containsExactly(ref("/b/test/+/baz", "baz")).inOrder();
   }
 
   @Test
@@ -234,9 +245,7 @@
     repo.branch("refs/tags/foo").commit().create();
 
     assertThat(buildBranchesSoyData())
-        .containsExactly(
-            ref("/b/test/+/bar", "bar"),
-            ref("/b/test/+/refs/heads/foo", "foo"))
+        .containsExactly(ref("/b/test/+/bar", "bar"), ref("/b/test/+/refs/heads/foo", "foo"))
         .inOrder();
     assertThat(buildTagsSoyData())
         .containsExactly(
@@ -253,13 +262,9 @@
     repo.branch("refs/tags/foo").commit().create();
 
     assertThat(buildBranchesSoyData())
-        .containsExactly(
-            ref("/b/test/+/refs/heads/foo", "foo"))
+        .containsExactly(ref("/b/test/+/refs/heads/foo", "foo"))
         .inOrder();
-    assertThat(buildTagsSoyData())
-        .containsExactly(
-            ref("/b/test/+/refs/tags/foo", "foo"))
-        .inOrder();
+    assertThat(buildTagsSoyData()).containsExactly(ref("/b/test/+/refs/tags/foo", "foo")).inOrder();
   }
 
   @Test
@@ -276,11 +281,13 @@
 
   private HttpServletRequest buildSoyRequest() {
     HttpServletRequest req = FakeHttpServletRequest.newRequest(repo.getRepository());
-    ViewFilter.setView(req, GitilesView.repositoryIndex()
-        .setHostName(URLS.getHostName(req))
-        .setServletPath(req.getServletPath())
-        .setRepositoryName("test")
-        .build());
+    ViewFilter.setView(
+        req,
+        GitilesView.repositoryIndex()
+            .setHostName(URLS.getHostName(req))
+            .setServletPath(req.getServletPath())
+            .setRepositoryName("test")
+            .build());
     return req;
   }
 
@@ -290,8 +297,8 @@
 
   private List<?> buildTagsSoyData() throws Exception {
     try (RevWalk rw = new RevWalk(repo.getRepository())) {
-      return RefServlet.getTagsSoyData(buildSoyRequest(),
-          new TimeCache(TimeCache.defaultBuilder()), rw, Integer.MAX_VALUE);
+      return RefServlet.getTagsSoyData(
+          buildSoyRequest(), new TimeCache(TimeCache.defaultBuilder()), rw, Integer.MAX_VALUE);
     }
   }
 
@@ -300,8 +307,8 @@
   }
 
   private String peeled(String refName) throws IOException {
-    return ObjectId.toString(repo.getRepository().peel(
-          repo.getRepository().getRef(refName)).getPeeledObjectId());
+    return ObjectId.toString(
+        repo.getRepository().peel(repo.getRepository().getRef(refName)).getPeeledObjectId());
   }
 
   private Map<String, String> ref(String url, String name) {
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 c5f2871..85311a8 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RevisionParserTest.java
@@ -42,19 +42,20 @@
 
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription("test")));
-    parser = new RevisionParser(
-        repo.getRepository(),
-        new TestGitilesAccess(repo.getRepository()).forRequest(null),
-        new VisibilityCache(false, CacheBuilder.newBuilder().maximumSize(0)));
+    repo =
+        new TestRepository<DfsRepository>(
+            new InMemoryRepository(new DfsRepositoryDescription("test")));
+    parser =
+        new RevisionParser(
+            repo.getRepository(),
+            new TestGitilesAccess(repo.getRepository()).forRequest(null),
+            new VisibilityCache(false, CacheBuilder.newBuilder().maximumSize(0)));
   }
 
   @Test
   public void parseRef() throws Exception {
     RevCommit master = repo.branch("refs/heads/master").commit().create();
-    assertThat(parser.parse("master"))
-        .isEqualTo(new Result(Revision.peeled("master", master)));
+    assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", master)));
     assertThat(parser.parse("refs/heads/master"))
         .isEqualTo(new Result(Revision.peeled("refs/heads/master", master)));
     assertThat(parser.parse("refs//heads//master")).isNull();
@@ -66,10 +67,7 @@
     RevCommit root = repo.commit().create();
     RevCommit parent1 = repo.commit().parent(root).create();
     RevCommit parent2 = repo.commit().parent(root).create();
-    RevCommit merge = repo.branch("master").commit()
-        .parent(parent1)
-        .parent(parent2)
-        .create();
+    RevCommit merge = repo.branch("master").commit().parent(parent1).parent(parent2).create();
     assertThat(parser.parse("master")).isEqualTo(new Result(Revision.peeled("master", merge)));
     assertThat(parser.parse("master^")).isEqualTo(new Result(Revision.peeled("master^", parent1)));
     assertThat(parser.parse("master~1"))
@@ -151,44 +149,39 @@
     RevCommit commit = repo.branch("master").commit().parent(parent).create();
     RevCommit other = repo.branch("other").commit().create();
 
-    assertThat(parser.parse("master^..master")).isEqualTo(
-        new Result(
-            Revision.peeled("master", commit),
-            Revision.peeled("master^", parent),
-            ""));
-    assertThat(parser.parse("master^..master/")).isEqualTo(
-        new Result(
-            Revision.peeled("master", commit),
-            Revision.peeled("master^", parent),
-            "/"));
-    assertThat(parser.parse("master^..master/path/to/a/file")).isEqualTo(
-        new Result(
-            Revision.peeled("master", commit),
-            Revision.peeled("master^", parent),
-            "/path/to/a/file"));
-    assertThat(parser.parse("master^..master/path/to/a/..file")).isEqualTo(
-        new Result(
-            Revision.peeled("master", commit),
-            Revision.peeled("master^", parent),
-            "/path/to/a/..file"));
-    assertThat(parser.parse("refs/heads/master^..refs/heads/master")).isEqualTo(
-        new Result(
-            Revision.peeled("refs/heads/master", commit),
-            Revision.peeled("refs/heads/master^", parent),
-            ""));
-    assertThat(parser.parse("master~1..master")).isEqualTo(
-        new Result(
-            Revision.peeled("master", commit),
-            Revision.peeled("master~1", parent),
-            ""));
+    assertThat(parser.parse("master^..master"))
+        .isEqualTo(
+            new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
+    assertThat(parser.parse("master^..master/"))
+        .isEqualTo(
+            new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), "/"));
+    assertThat(parser.parse("master^..master/path/to/a/file"))
+        .isEqualTo(
+            new Result(
+                Revision.peeled("master", commit),
+                Revision.peeled("master^", parent),
+                "/path/to/a/file"));
+    assertThat(parser.parse("master^..master/path/to/a/..file"))
+        .isEqualTo(
+            new Result(
+                Revision.peeled("master", commit),
+                Revision.peeled("master^", parent),
+                "/path/to/a/..file"));
+    assertThat(parser.parse("refs/heads/master^..refs/heads/master"))
+        .isEqualTo(
+            new Result(
+                Revision.peeled("refs/heads/master", commit),
+                Revision.peeled("refs/heads/master^", parent),
+                ""));
+    assertThat(parser.parse("master~1..master"))
+        .isEqualTo(
+            new Result(Revision.peeled("master", commit), Revision.peeled("master~1", parent), ""));
     // TODO(dborowitz): 2a2362fbb in JGit causes master~2 to resolve to master
     // rather than null. Uncomment when upstream regression is fixed.
     //assertThat(parser.parse("master~2..master")).isNull();
-    assertThat(parser.parse("other..master")).isEqualTo(
-        new Result(
-            Revision.peeled("master", commit),
-            Revision.peeled("other", other),
-            ""));
+    assertThat(parser.parse("other..master"))
+        .isEqualTo(
+            new Result(Revision.peeled("master", commit), Revision.peeled("other", other), ""));
   }
 
   @Test
@@ -196,33 +189,19 @@
     RevCommit parent = repo.commit().create();
     RevCommit commit = repo.branch("master").commit().parent(parent).create();
 
-    assertThat(parser.parse("master^!")).isEqualTo(
-        new Result(
-            Revision.peeled("master", commit),
-            Revision.peeled("master^", parent),
-            ""));
-    assertThat(parser.parse("master^^!")).isEqualTo(
-        new Result(
-            Revision.peeled("master^", parent),
-            Revision.NULL,
-            ""));
-    assertThat(parser.parse(parent.name() + "^!")).isEqualTo(
-        new Result(
-            Revision.peeled(parent.name(), parent),
-            Revision.NULL,
-            ""));
+    assertThat(parser.parse("master^!"))
+        .isEqualTo(
+            new Result(Revision.peeled("master", commit), Revision.peeled("master^", parent), ""));
+    assertThat(parser.parse("master^^!"))
+        .isEqualTo(new Result(Revision.peeled("master^", parent), Revision.NULL, ""));
+    assertThat(parser.parse(parent.name() + "^!"))
+        .isEqualTo(new Result(Revision.peeled(parent.name(), parent), Revision.NULL, ""));
 
     repo.update("refs/tags/tag", repo.tag("tag", commit));
-    assertThat(parser.parse("tag^!")).isEqualTo(
-        new Result(
-            Revision.peeled("tag", commit),
-            Revision.peeled("tag^", parent),
-            ""));
-    assertThat(parser.parse("tag^^!")).isEqualTo(
-        new Result(
-            Revision.peeled("tag^", parent),
-            Revision.NULL,
-            ""));
+    assertThat(parser.parse("tag^!"))
+        .isEqualTo(new Result(Revision.peeled("tag", commit), Revision.peeled("tag^", parent), ""));
+    assertThat(parser.parse("tag^^!"))
+        .isEqualTo(new Result(Revision.peeled("tag^", parent), Revision.NULL, ""));
   }
 
   @Test
@@ -233,29 +212,26 @@
     assertThat(parser.parse("master..other")).isNull();
 
     repo.branch("other").update(other);
-    assertThat(parser.parse("other..master")).isEqualTo(
-        new Result(
-            Revision.peeled("master", master),
-            Revision.peeled("other", other),
-            ""));
-    assertThat(parser.parse("master..other")).isEqualTo(
-        new Result(
-            Revision.peeled("other", other),
-            Revision.peeled("master", master),
-            ""));
+    assertThat(parser.parse("other..master"))
+        .isEqualTo(
+            new Result(Revision.peeled("master", master), Revision.peeled("other", other), ""));
+    assertThat(parser.parse("master..other"))
+        .isEqualTo(
+            new Result(Revision.peeled("other", other), Revision.peeled("master", master), ""));
   }
 
   @Test
   public void parseTag() throws Exception {
     RevCommit master = repo.branch("master").commit().create();
     RevTag masterTag = repo.update("refs/tags/master-tag", repo.tag("master-tag", master));
-    RevTag masterTagTag = repo.update("refs/tags/master-tag-tag",
-        repo.tag("master-tag-tag", master));
+    RevTag masterTagTag =
+        repo.update("refs/tags/master-tag-tag", repo.tag("master-tag-tag", master));
 
-    assertThat(parser.parse("master-tag")).isEqualTo(
-        new Result(new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)));
-    assertThat(parser.parse("master-tag-tag")).isEqualTo(
-        new Result(new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)));
+    assertThat(parser.parse("master-tag"))
+        .isEqualTo(new Result(new Revision("master-tag", masterTag, OBJ_TAG, master, OBJ_COMMIT)));
+    assertThat(parser.parse("master-tag-tag"))
+        .isEqualTo(
+            new Result(new Revision("master-tag-tag", masterTagTag, OBJ_TAG, master, OBJ_COMMIT)));
 
     RevBlob blob = repo.update("refs/tags/blob", repo.blob("blob"));
     RevTag blobTag = repo.update("refs/tags/blob-tag", repo.tag("blob-tag", blob));
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
index 01de750..fdf2eec 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
@@ -57,12 +57,11 @@
 
   @After
   public void tearDown() {
-      SystemReader.setInstance(null);
+    SystemReader.setInstance(null);
   }
 
   protected FakeHttpServletResponse buildResponse(
-      String path, String queryString, int expectedStatus)
-      throws Exception {
+      String path, String queryString, int expectedStatus) throws Exception {
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest();
     req.setPathInfo(path);
     if (queryString != null) {
@@ -118,8 +117,7 @@
     return body.substring(magic.length());
   }
 
-  protected <T> T buildJson(Class<T> classOfT, String path, String queryString)
-      throws Exception {
+  protected <T> T buildJson(Class<T> classOfT, String path, String queryString) throws Exception {
     return newGson().fromJson(buildJsonRaw(path, queryString), classOfT);
   }
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java
index 2a6eb87..50c91a5 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesAccess.java
@@ -40,8 +40,8 @@
   public GitilesAccess forRequest(final HttpServletRequest req) {
     return new GitilesAccess() {
       @Override
-      public Map<String, RepositoryDescription> listRepositories(String prefix,
-          Set<String> branches) {
+      public Map<String, RepositoryDescription> listRepositories(
+          String prefix, Set<String> branches) {
         String name = repo.getDescription().getRepositoryName();
         if (prefix != null) {
           String pattern = CharMatcher.is('/').trimFrom(prefix) + '/';
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java
index b2574a7..9b80a56 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesServlet.java
@@ -53,14 +53,17 @@
    * @param gitwebRedirect optional redirect filter for gitweb URLs.
    * @return a servlet.
    */
-  public static GitilesServlet create(final TestRepository<DfsRepository> repo,
-      GitwebRedirectFilter gitwebRedirect) throws ServletException {
-    final String repoName =
-        repo.getRepository().getDescription().getRepositoryName();
+  public static GitilesServlet create(
+      final TestRepository<DfsRepository> repo, GitwebRedirectFilter gitwebRedirect)
+      throws ServletException {
+    final String repoName = repo.getRepository().getDescription().getRepositoryName();
     GitilesServlet servlet =
-        new GitilesServlet(new Config(), new DefaultRenderer(GitilesServlet.STATIC_PREFIX,
-              ImmutableList.<URL> of(), repoName + " test site"),
-            TestGitilesUrls.URLS, new TestGitilesAccess(repo.getRepository()),
+        new GitilesServlet(
+            new Config(),
+            new DefaultRenderer(
+                GitilesServlet.STATIC_PREFIX, ImmutableList.<URL>of(), repoName + " test site"),
+            TestGitilesUrls.URLS,
+            new TestGitilesAccess(repo.getRepository()),
             new RepositoryResolver<HttpServletRequest>() {
               @Override
               public Repository open(HttpServletRequest req, String name)
@@ -70,32 +73,36 @@
                 }
                 return repo.getRepository();
               }
-            }, null, null, null, gitwebRedirect);
+            },
+            null,
+            null,
+            null,
+            gitwebRedirect);
 
-    servlet.init(new ServletConfig() {
-      @Override
-      public String getInitParameter(String name) {
-        return null;
-      }
+    servlet.init(
+        new ServletConfig() {
+          @Override
+          public String getInitParameter(String name) {
+            return null;
+          }
 
-      @Override
-      public Enumeration<String> getInitParameterNames() {
-        return Collections.enumeration(ImmutableList.<String> of());
-      }
+          @Override
+          public Enumeration<String> getInitParameterNames() {
+            return Collections.enumeration(ImmutableList.<String>of());
+          }
 
-      @Override
-      public ServletContext getServletContext() {
-        return null;
-      }
+          @Override
+          public ServletContext getServletContext() {
+            return null;
+          }
 
-      @Override
-      public String getServletName() {
-        return TestGitilesServlet.class.getName();
-      }
-    });
+          @Override
+          public String getServletName() {
+            return TestGitilesServlet.class.getName();
+          }
+        });
     return servlet;
   }
 
-  private TestGitilesServlet() {
-  }
+  private TestGitilesServlet() {}
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesUrls.java b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesUrls.java
index 14ccef7..29cc014 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesUrls.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TestGitilesUrls.java
@@ -36,6 +36,5 @@
     return "http://" + HOST_NAME + "-review/foo/";
   }
 
-  private TestGitilesUrls() {
-  }
+  private TestGitilesUrls() {}
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java b/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java
index bb3d732..9a7f4cb 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TestViewFilter.java
@@ -64,16 +64,15 @@
   public static Result service(TestRepository<? extends DfsRepository> repo, String pathAndQuery)
       throws IOException, ServletException {
     TestServlet servlet = new TestServlet();
-    ViewFilter vf = new ViewFilter(
-        new TestGitilesAccess(repo.getRepository()),
-        TestGitilesUrls.URLS,
-        new VisibilityCache(false));
+    ViewFilter vf =
+        new ViewFilter(
+            new TestGitilesAccess(repo.getRepository()),
+            TestGitilesUrls.URLS,
+            new VisibilityCache(false));
     MetaFilter mf = new MetaFilter();
 
     for (Pattern p : ImmutableList.of(ROOT_REGEX, REPO_REGEX, REPO_PATH_REGEX)) {
-      mf.serveRegex(p)
-          .through(vf)
-          .with(servlet);
+      mf.serveRegex(p).through(vf).with(servlet);
     }
 
     FakeHttpServletRequest req = newRequest(repo, pathAndQuery);
@@ -101,8 +100,8 @@
     }
   }
 
-  private static FakeHttpServletRequest newRequest(TestRepository<? extends DfsRepository> repo,
-      String pathAndQuery) {
+  private static FakeHttpServletRequest newRequest(
+      TestRepository<? extends DfsRepository> repo, String pathAndQuery) {
     FakeHttpServletRequest req = FakeHttpServletRequest.newRequest(repo.getRepository());
     int q = pathAndQuery.indexOf('?');
     if (q > 0) {
@@ -120,6 +119,5 @@
     };
   }
 
-  private TestViewFilter() {
-  }
+  private TestViewFilter() {}
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
index 7100359..e34bc88 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
@@ -51,8 +51,9 @@
 
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription("test")));
+    repo =
+        new TestRepository<DfsRepository>(
+            new InMemoryRepository(new DfsRepositoryDescription("test")));
     walk = new RevWalk(repo.getRepository());
     cache = new TimeCache();
     start = repo.getDate().getTime() / 1000;
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java
index bbf5d37..001ef02 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TreeSoyDataTest.java
@@ -32,26 +32,28 @@
   public void getTargetDisplayNameReturnsDisplayName() throws Exception {
     assertThat(getTargetDisplayName("foo")).isEqualTo("foo");
     assertThat(getTargetDisplayName("foo/bar")).isEqualTo("foo/bar");
-    assertThat(getTargetDisplayName(Strings.repeat("a/", 10) + "bar")).isEqualTo(
-        "a/a/a/a/a/a/a/a/a/a/bar");
-    assertThat(getTargetDisplayName(Strings.repeat("a/", 34) + "bar")).isEqualTo(
-        "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/bar");
+    assertThat(getTargetDisplayName(Strings.repeat("a/", 10) + "bar"))
+        .isEqualTo("a/a/a/a/a/a/a/a/a/a/bar");
+    assertThat(getTargetDisplayName(Strings.repeat("a/", 34) + "bar"))
+        .isEqualTo("a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/bar");
     assertThat(getTargetDisplayName(Strings.repeat("a/", 35) + "bar")).isEqualTo(".../bar");
     assertThat(getTargetDisplayName(Strings.repeat("a/", 100) + "bar")).isEqualTo(".../bar");
-    assertThat(getTargetDisplayName(Strings.repeat("a", 80))).isEqualTo(
-        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+    assertThat(getTargetDisplayName(Strings.repeat("a", 80)))
+        .isEqualTo(
+            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
   }
 
   @Test
   public void resolveTargetUrlReturnsUrl() throws Exception {
     ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    GitilesView view = GitilesView.path()
-        .setServletPath("/x")
-        .setHostName("host")
-        .setRepositoryName("repo")
-        .setRevision(Revision.unpeeled("m", id))
-        .setPathPart("a/b/c")
-        .build();
+    GitilesView view =
+        GitilesView.path()
+            .setServletPath("/x")
+            .setHostName("host")
+            .setRepositoryName("repo")
+            .setRevision(Revision.unpeeled("m", id))
+            .setPathPart("a/b/c")
+            .build();
     assertThat(resolveTargetUrl(view, "/foo")).isNull();
     assertThat(resolveTargetUrl(view, "../../")).isEqualTo("/x/repo/+/m/a");
     assertThat(resolveTargetUrl(view, ".././../")).isEqualTo("/x/repo/+/m/a");
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java
index 4bdbc08..32cb7ca 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ViewFilterTest.java
@@ -41,8 +41,9 @@
 
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription("repo")));
+    repo =
+        new TestRepository<DfsRepository>(
+            new InMemoryRepository(new DfsRepositoryDescription("repo")));
   }
 
   @Test
@@ -510,7 +511,8 @@
     TestViewFilter.Result result = TestViewFilter.service(repo, pathAndQuery);
     FakeHttpServletResponse resp = result.getResponse();
     assertWithMessage("expected non-redirect status, got " + resp.getStatus())
-        .that(resp.getStatus() < 300 || resp.getStatus() >= 400).isTrue();
+        .that(resp.getStatus() < 300 || resp.getStatus() >= 400)
+        .isTrue();
     return result.getView();
   }
 }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
index f4fb859..265866b 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
@@ -33,6 +33,7 @@
 public class BlameServletTest extends ServletTest {
   private static final String NAME = "J. Author";
   private static final String EMAIL = "jauthor@example.com";
+
   private static class RegionJsonData {
     int start;
     int count;
@@ -47,8 +48,7 @@
     String contents2 = "foo\ncontents\n";
     RevCommit c1 = repo.update("master", repo.commit().add("foo", contents1));
     String c1Time = currentTimeFormatted();
-    RevCommit c2 = repo.update("master",
-        repo.commit().tick(10).parent(c1).add("foo", contents2));
+    RevCommit c2 = repo.update("master", repo.commit().tick(10).parent(c1).add("foo", contents2));
     String c2Time = currentTimeFormatted();
 
     Map<String, List<RegionJsonData>> result = getBlameJson("/repo/+blame/" + c2.name() + "/foo");
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
index c5d461f..ad0f4e2 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/doc/DocServletTest.java
@@ -29,13 +29,9 @@
   public void simpleReadmeDoc() throws Exception {
     String title = "DocServletTest simpleDoc";
     String url = "http://daringfireball.net/projects/markdown/syntax";
-    String markdown = "# " + title + "\n"
-        + "\n"
-        + "Tests the rendering of "
-        + "[Markdown](" + url + ").";
-    repo.branch("master").commit()
-        .add("README.md", markdown)
-        .create();
+    String markdown =
+        "# " + title + "\n" + "\n" + "Tests the rendering of " + "[Markdown](" + url + ").";
+    repo.branch("master").commit().add("README.md", markdown).create();
 
     String html = buildHtml("/repo/+doc/master/README.md");
     assertThat(html).contains("<title>" + title + "</title>");
@@ -45,11 +41,9 @@
 
   @Test
   public void includesNavbar() throws Exception {
-    String navbar = "# Site Title\n"
-        + "\n"
-        + "* [Home](index.md)\n"
-        + "* [README](README.md)\n";
-    repo.branch("master").commit()
+    String navbar = "# Site Title\n" + "\n" + "* [Home](index.md)\n" + "* [README](README.md)\n";
+    repo.branch("master")
+        .commit()
         .add("README.md", "# page\n\nof information.")
         .add("navbar.md", navbar)
         .create();
@@ -60,21 +54,20 @@
     assertThat(html).contains("<span class=\"Header-anchorTitle\">Site Title</span>");
     assertThat(html).contains("<li><a href=\"index.md\">Home</a></li>");
     assertThat(html).contains("<li><a href=\"README.md\">README</a></li>");
-    assertThat(html).contains("<h1>"
-        + "<a class=\"h\" name=\"page\" href=\"#page\"><span></span></a>"
-        + "page</h1>");
+    assertThat(html)
+        .contains(
+            "<h1>" + "<a class=\"h\" name=\"page\" href=\"#page\"><span></span></a>" + "page</h1>");
   }
 
   @Test
   public void dropsHtml() throws Exception {
-    String markdown = "# B. Ad\n"
-        + "\n"
-        + "<script>window.alert();</script>\n"
-        + "\n"
-        + "Non-HTML <b>is fine</b>.";
-    repo.branch("master").commit()
-        .add("index.md", markdown)
-        .create();
+    String markdown =
+        "# B. Ad\n"
+            + "\n"
+            + "<script>window.alert();</script>\n"
+            + "\n"
+            + "Non-HTML <b>is fine</b>.";
+    repo.branch("master").commit().add("index.md", markdown).create();
 
     String html = buildHtml("/repo/+doc/master/");
     assertThat(html).contains("B. Ad</h1>");
@@ -86,26 +79,25 @@
 
   @Test
   public void namedAnchor() throws Exception {
-    String markdown = "# Section {#debug}\n"
-        + "# Other <a name=\"old-school\"></a>\n";
-    repo.branch("master").commit()
-      .add("index.md", markdown)
-      .create();
+    String markdown = "# Section {#debug}\n" + "# Other <a name=\"old-school\"></a>\n";
+    repo.branch("master").commit().add("index.md", markdown).create();
     String html = buildHtml("/repo/+doc/master/");
-    assertThat(html).contains("<h1>"
-        + "<a class=\"h\" name=\"debug\" href=\"#debug\"><span></span></a>"
-        + "Section</h1>");
-    assertThat(html).contains("<h1>"
-        + "<a class=\"h\" name=\"old-school\" href=\"#old-school\"><span></span></a>"
-        + "Other</h1>");
+    assertThat(html)
+        .contains(
+            "<h1>"
+                + "<a class=\"h\" name=\"debug\" href=\"#debug\"><span></span></a>"
+                + "Section</h1>");
+    assertThat(html)
+        .contains(
+            "<h1>"
+                + "<a class=\"h\" name=\"old-school\" href=\"#old-school\"><span></span></a>"
+                + "Other</h1>");
   }
 
   @Test
   public void incompleteHtmlIsLiteral() throws Exception {
     String markdown = "Incomplete <html is literal.";
-    repo.branch("master").commit()
-        .add("index.md", markdown)
-        .create();
+    repo.branch("master").commit().add("index.md", markdown).create();
 
     String html = buildHtml("/repo/+doc/master/index.md");
     assertThat(html).contains("Incomplete &lt;html is literal.");
@@ -113,9 +105,7 @@
 
   @Test
   public void relativeLink() throws Exception {
-    repo.branch("master").commit()
-        .add("A/B/README.md", "[c](../../C)")
-        .create();
+    repo.branch("master").commit().add("A/B/README.md", "[c](../../C)").create();
 
     String html = buildHtml("/repo/+doc/master/A/B/README.md");
     assertThat(html).contains("<a href=\"/b/repo/+show/master/C\">c</a>");
@@ -123,12 +113,9 @@
 
   @Test
   public void absoluteLink() throws Exception {
-    repo.branch("master").commit()
-        .add("README.md", "[c](/x)")
-        .create();
+    repo.branch("master").commit().add("README.md", "[c](/x)").create();
 
     String html = buildHtml("/repo/+doc/master/README.md");
     assertThat(html).contains("<a href=\"/b/repo/+show/master/x\">c</a>");
   }
-
 }
