Merge "Update soy to 2016-08-09 and icu4j to 57.1"
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index fd3f3f9..30d37f5 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -44,6 +44,7 @@
 import org.eclipse.jgit.revwalk.FollowFilter;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevSort;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.revwalk.filter.AndRevFilter;
@@ -97,7 +98,7 @@
     Paginator paginator = null;
     try {
       GitilesAccess access = getAccess(req);
-      paginator = newPaginator(repo, view, getAccess(req));
+      paginator = newPaginator(repo, view, access);
       if (paginator == null) {
         res.setStatus(SC_NOT_FOUND);
         return;
@@ -158,12 +159,13 @@
 
     Paginator paginator = null;
     try {
-      paginator = newPaginator(repo, view, getAccess(req));
+      GitilesAccess access = getAccess(req);
+      paginator = newPaginator(repo, view, access);
       if (paginator == null) {
         res.setStatus(SC_NOT_FOUND);
         return;
       }
-      DateFormatter df = new DateFormatter(getAccess(req), Format.DEFAULT);
+      DateFormatter df = new DateFormatter(access, Format.DEFAULT);
       CommitJsonData.Log result = new CommitJsonData.Log();
       List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
       for (RevCommit c : paginator) {
@@ -236,24 +238,37 @@
       return null;
     }
     setTreeFilter(walk, view, access);
+    setRevFilter(walk, view);
+    if (isTrue(view, "topo-order")) {
+      walk.sort(RevSort.TOPO, true);
+    }
+    if (isTrue(view, "reverse")) {
+      walk.sort(RevSort.REVERSE, true);
+    }
+    return walk;
+  }
+
+  private static void setRevFilter(RevWalk walk, GitilesView view) {
     List<RevFilter> filters = new ArrayList<>(3);
-    if (isTrue(Iterables.getFirst(view.getParameters().get("no-merges"), null))) {
+    if (isTrue(view, "no-merges")) {
       filters.add(RevFilter.NO_MERGES);
     }
+
     String author = Iterables.getFirst(view.getParameters().get("author"), null);
     if (author != null) {
       filters.add(IdentRevFilter.author(author));
     }
+
     String committer = Iterables.getFirst(view.getParameters().get("committer"), null);
     if (committer != null) {
       filters.add(IdentRevFilter.committer(committer));
     }
+
     if (filters.size() > 1) {
       walk.setRevFilter(AndRevFilter.create(filters));
     } else if (filters.size() == 1) {
       walk.setRevFilter(filters.get(0));
     }
-    return walk;
   }
 
   private static void setTreeFilter(RevWalk walk, GitilesView view, GitilesAccess access)
@@ -277,6 +292,10 @@
     }
   }
 
+  private static boolean isTrue(GitilesView view, String param) {
+    return isTrue(Iterables.getFirst(view.getParameters().get(param), null));
+  }
+
   private static boolean isTrue(String v) {
     if (v == null) {
       return false;