Provide a support to blame on a given commit. This is done by passing in
RevCommit as a start to blame.

The underlying jgit commit 87efbcb adds a support to accept a start
commit. Passing in a FilteredRevCommit that overrides parents would save
a lot of time walking/finding commits to be blamed on.

Change-Id: Ia2b45fe540b70ca940f247baf16b2e15d6aef599
diff --git a/java/com/google/gitiles/blame/cache/BlameCacheImpl.java b/java/com/google/gitiles/blame/cache/BlameCacheImpl.java
index 75ab09b..2fa80f5 100644
--- a/java/com/google/gitiles/blame/cache/BlameCacheImpl.java
+++ b/java/com/google/gitiles/blame/cache/BlameCacheImpl.java
@@ -32,6 +32,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jgit.blame.BlameGenerator;
+import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Repository;
@@ -133,9 +134,14 @@
     }
   }
 
-  public static List<Region> loadBlame(Key key, Repository repo) throws IOException {
+  public static List<Region> loadBlame(Key key, AnyObjectId blameCommit, Repository repo)
+      throws IOException {
+    if (blameCommit == null) {
+      return loadBlame(key, repo);
+    }
+
     try (BlameGenerator gen = new BlameGenerator(repo, key.path)) {
-      gen.push(null, key.commitId);
+      gen.push(null, blameCommit);
       if (gen.getResultContents() == null) {
         return ImmutableList.of();
       }
@@ -143,6 +149,10 @@
     }
   }
 
+  public static List<Region> loadBlame(Key key, Repository repo) throws IOException {
+    return loadBlame(key, key.commitId, repo);
+  }
+
   private static class PooledCommit {
     final ObjectId commit;
     final PersonIdent author;
@@ -192,7 +202,8 @@
       if (last != null) {
         checkState(last.getEnd() <= r.getStart());
         if (last.getEnd() < r.getStart()) {
-          result.add(new Region(null, null, null, last.getEnd(), r.getStart()));
+          result.add(
+              new Region(null, null, null, /* start= */ last.getEnd(), /* end= */ r.getStart()));
         }
       }
       result.add(r);