Accept first-parent parameter in LogServlet

The parameter "first-parent" is now accepted for +log. Providing
first-parent will result in +log returning commits from walking only
along first-parents when merge commits are encountered. first-parent can
be provided with the other currently supported parameters, topo-order
and reverse.

Signed-off-by: Alex Spradlin <alexaspradlin@google.com>
Change-Id: Ie9b8ed3c4ac9cbb4f192615048861b58b17b655b
diff --git a/java/com/google/gitiles/LogServlet.java b/java/com/google/gitiles/LogServlet.java
index 4d038ae..c738f0e 100644
--- a/java/com/google/gitiles/LogServlet.java
+++ b/java/com/google/gitiles/LogServlet.java
@@ -71,6 +71,9 @@
   private static final String FOLLOW_PARAM = "follow";
   private static final String NAME_STATUS_PARAM = "name-status";
   private static final String PRETTY_PARAM = "pretty";
+  private static final String TOPO_ORDER_PARAM = "topo-order";
+  private static final String REVERSE_PARAM = "reverse";
+  private static final String FIRST_PARENT_PARAM = "first-parent";
 
   private static final int DEFAULT_LIMIT = 100;
   private static final int MAX_LIMIT = 10000;
@@ -223,6 +226,15 @@
   private static RevWalk newWalk(Repository repo, GitilesView view, GitilesAccess access)
       throws MissingObjectException, IOException {
     RevWalk walk = new RevWalk(repo);
+    if (isTrue(view, FIRST_PARENT_PARAM)) {
+      walk.setFirstParent(true);
+    }
+    if (isTrue(view, TOPO_ORDER_PARAM)) {
+      walk.sort(RevSort.TOPO, true);
+    }
+    if (isTrue(view, REVERSE_PARAM)) {
+      walk.sort(RevSort.REVERSE, true);
+    }
     try {
       walk.markStart(walk.parseCommit(view.getRevision().getId()));
       if (!Revision.isNull(view.getOldRevision())) {
@@ -233,12 +245,6 @@
     }
     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;
   }
 
diff --git a/javatests/com/google/gitiles/LogServletTest.java b/javatests/com/google/gitiles/LogServletTest.java
index 06ddaf4..7232439 100644
--- a/javatests/com/google/gitiles/LogServletTest.java
+++ b/javatests/com/google/gitiles/LogServletTest.java
@@ -67,6 +67,19 @@
   }
 
   @Test
+  public void firstParentLog() throws Exception {
+    RevCommit p1 = repo.update("master", repo.commit().add("foo", "foo\n"));
+    RevCommit p2 = repo.update("master", repo.commit().add("foo", "foo2\n"));
+    RevCommit c = repo.update("master", repo.commit().parent(p1).parent(p2).add("foo", "foo3\n"));
+
+    Log response = buildJson(LOG, "/repo/+log/master", "first-parent");
+    assertThat(response.log).hasSize(2);
+
+    verifyJsonCommit(response.log.get(0), c);
+    verifyJsonCommit(response.log.get(1), p1);
+  }
+
+  @Test
   public void follow() throws Exception {
     String contents = "contents";
     RevCommit c1 = repo.branch("master").commit().add("foo", contents).create();