Merge "Bump Java language level to Java 11"
diff --git a/Documentation/markdown.md b/Documentation/markdown.md
index e6b766c..4c76388 100644
--- a/Documentation/markdown.md
+++ b/Documentation/markdown.md
@@ -446,7 +446,7 @@
 PNG (`*.png`), JPEG (`*.jpg` or `*.jpeg`), GIF (`*.gif`) and WebP (`*.webp`)
 image formats are supported when referenced from the Git repository.
 
-Unsupported extensions or files larger than [image size](#Image-size)
+Unsupported extensions or files larger than [image size](config.md#Image-size)
 limit (default 256K) will display a broken image.
 
 *** note
diff --git a/java/com/google/gitiles/BranchRedirect.java b/java/com/google/gitiles/BranchRedirect.java
index 099d251..3a34f65 100644
--- a/java/com/google/gitiles/BranchRedirect.java
+++ b/java/com/google/gitiles/BranchRedirect.java
@@ -22,9 +22,9 @@
 
 /**
  * Utility that provides information to replace the URL string that contains a branch name to a new
- * branch name. The updated branch mapping is provided by {@code
- * BranchRedirectFilter#getRedirectBranch} method. If it should update the branch then it is the
- * caller's responsibility to update the URL with updated branch name as redirect.
+ * branch name. The updated branch mapping is provided by {@code BranchRedirect#getRedirectBranch}
+ * method. If it should update the branch then it is the caller's responsibility to update the URL
+ * with updated branch name as redirect.
  *
  * <p>This implementation does not provide a branch redirect mapping. Hence, including this as-is
  * would be a no-op. To make this effective {@code BranchRedirect#getRedirectBranch} needs to be
diff --git a/java/com/google/gitiles/LogServlet.java b/java/com/google/gitiles/LogServlet.java
index c738f0e..645264b 100644
--- a/java/com/google/gitiles/LogServlet.java
+++ b/java/com/google/gitiles/LogServlet.java
@@ -230,7 +230,7 @@
       walk.setFirstParent(true);
     }
     if (isTrue(view, TOPO_ORDER_PARAM)) {
-      walk.sort(RevSort.TOPO, true);
+      walk.sort(RevSort.TOPO_KEEP_BRANCH_TOGETHER, true);
     }
     if (isTrue(view, REVERSE_PARAM)) {
       walk.sort(RevSort.REVERSE, true);
diff --git a/java/com/google/gitiles/dev/DevServer.java b/java/com/google/gitiles/dev/DevServer.java
index 5a8fed5..028edd6 100644
--- a/java/com/google/gitiles/dev/DevServer.java
+++ b/java/com/google/gitiles/dev/DevServer.java
@@ -19,7 +19,7 @@
 
 import com.google.common.base.Strings;
 import com.google.common.html.types.UncheckedConversions;
-import com.google.gitiles.BranchRedirectFilter;
+import com.google.gitiles.BranchRedirect;
 import com.google.gitiles.DebugRenderer;
 import com.google.gitiles.GitilesAccess;
 import com.google.gitiles.GitilesServlet;
@@ -140,7 +140,7 @@
     } else {
       servlet =
           new GitilesServlet(
-              cfg, renderer, null, null, null, null, null, null, null, new BranchRedirectFilter());
+              cfg, renderer, null, null, null, null, null, null, null, new BranchRedirect());
     }
 
     ServletContextHandler handler = new ServletContextHandler();
diff --git a/javatests/com/google/gitiles/LogServletTest.java b/javatests/com/google/gitiles/LogServletTest.java
index 7232439..4ef7a4d 100644
--- a/javatests/com/google/gitiles/LogServletTest.java
+++ b/javatests/com/google/gitiles/LogServletTest.java
@@ -80,6 +80,24 @@
   }
 
   @Test
+  public void topoKeepBranchTogetherLog() throws Exception {
+    RevCommit a = repo.update("master", repo.commit().add("foo", "foo\n"));
+    RevCommit b1 = repo.update("master", repo.commit().parent(a).add("foo", "foo3\n"));
+    RevCommit c = repo.update("master", repo.commit().parent(a).add("foo", "foo2\n"));
+    RevCommit b2 = repo.update("master", repo.commit().parent(b1).add("foo", "foo4\n"));
+    RevCommit d = repo.update("master", repo.commit().parent(c).parent(b2).add("foo", "foo5\n"));
+
+    Log response = buildJson(LOG, "/repo/+log/master", "topo-order");
+    assertThat(response.log).hasSize(5);
+
+    verifyJsonCommit(response.log.get(0), d);
+    verifyJsonCommit(response.log.get(1), b2);
+    verifyJsonCommit(response.log.get(2), b1);
+    verifyJsonCommit(response.log.get(3), c);
+    verifyJsonCommit(response.log.get(4), a);
+  }
+
+  @Test
   public void follow() throws Exception {
     String contents = "contents";
     RevCommit c1 = repo.branch("master").commit().add("foo", contents).create();