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;