Support setting limit on +log with ?n=

Set a hard upper limit to 10000 to avoid too-expensive calls.

Change-Id: Ib45201c46e182aa8669993db9ab11f3faa49482d
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 12280c2..4bc0d84 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -23,6 +23,8 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.primitives.Longs;
 import com.google.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.diff.DiffConfig;
@@ -57,8 +59,10 @@
   private static final long serialVersionUID = 1L;
   private static final Logger log = LoggerFactory.getLogger(LogServlet.class);
 
+  static final String LIMIT_PARAM = "n";
   static final String START_PARAM = "s";
-  private static final int LIMIT = 100;
+  private static final int DEFAULT_LIMIT = 100;
+  private static final int MAX_LIMIT = 10000;
 
   private final Linkifier linkifier;
 
@@ -215,6 +219,19 @@
     if (start == null) {
       return null;
     }
-    return new Paginator(walk, LIMIT, start.orNull());
+
+    return new Paginator(walk, getLimit(view), start.orNull());
+  }
+
+  private static int getLimit(GitilesView view) {
+    List<String> values = view.getParameters().get(LIMIT_PARAM);
+    if (values.isEmpty()) {
+      return DEFAULT_LIMIT;
+    }
+    Long limit = Longs.tryParse(values.get(0));
+    if (limit == null) {
+      return DEFAULT_LIMIT;
+    }
+    return (int) Math.min(limit, MAX_LIMIT);
   }
 }