Support /+log/?no-merges=1 and ?author=foo&no-merges=1

`git log` supports --no-merges to filter out commits with more than
one parent.  This can be useful to elide out any merge commits created
by a maintainer when pulling from a contributor.

Support combining the author, no-merges and committer parameters into
a single larger AndRevFilter to narrow the result set.

Change-Id: Ia298039569f34d27b0985a91486e9560462c6d7c
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 fc6db2e..48215c6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -42,15 +42,19 @@
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.revwalk.filter.AndRevFilter;
+import org.eclipse.jgit.revwalk.filter.RevFilter;
 import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
 import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
+import org.eclipse.jgit.util.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -211,17 +215,35 @@
           PathFilterGroup.createFromStrings(view.getPathPart()),
           TreeFilter.ANY_DIFF));
     }
+    List<RevFilter> filters = new ArrayList<>(3);
+    if (isTrue(Iterables.getFirst(view.getParameters().get("no-merges"), null))) {
+      filters.add(RevFilter.NO_MERGES);
+    }
     String author = Iterables.getFirst(view.getParameters().get("author"), null);
     if (author != null) {
-      walk.setRevFilter(IdentRevFilter.author(author));
+      filters.add(IdentRevFilter.author(author));
     }
     String committer = Iterables.getFirst(view.getParameters().get("committer"), null);
     if (committer != null) {
-      walk.setRevFilter(IdentRevFilter.committer(committer));
+      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 boolean isTrue(String v) {
+    if (v == null) {
+      return false;
+    } else if (v.isEmpty()) {
+      return true;
+    }
+    return Boolean.TRUE.equals(StringUtils.toBooleanOrNull(v));
+  }
+
   private static Paginator newPaginator(Repository repo, GitilesView view) throws IOException {
     if (view == null) {
       return null;