Merge changes Id3c53130,Iea5339da

* changes:
  gitiles-dev: inject source path through a System property.
  gitiles-dev: use nio.Path rather than io.File for sourceRoot.
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
index 6fc3211..0e435c6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DefaultAccess.java
@@ -161,6 +161,9 @@
 
   private String getRelativePath(String path) {
     String base = basePath.getPath();
+    if (path.equals(base)) {
+      return "";
+    }
     if (path.startsWith(base)) {
       return path.substring(base.length() + 1);
     }
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 bcc09eb..ae6219f 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -256,11 +256,16 @@
     }
     walk.setRewriteParents(false);
     String path = view.getPathPart();
-    if (isTrue(Iterables.getFirst(view.getParameters().get(FOLLOW_PARAM), null))) {
+
+    List<String> followParams = view.getParameters().get(FOLLOW_PARAM);
+    boolean follow = !followParams.isEmpty()
+        ? isTrue(followParams.get(0))
+        : access.getConfig().getBoolean("log", null, "follow", true);
+    if (follow) {
       walk.setTreeFilter(FollowFilter.create(path, access.getConfig().get(DiffConfig.KEY)));
     } else {
       walk.setTreeFilter(AndTreeFilter.create(
-          PathFilterGroup.createFromStrings(view.getPathPart()),
+          PathFilterGroup.createFromStrings(path),
           TreeFilter.ANY_DIFF));
     }
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
index 7f18de2..9c5edbd 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
@@ -219,10 +219,17 @@
         }
         Map<String, Object> e = Maps.newHashMapWithExpectedSize(6);
         e.put("abbrevSha", abbrevSha);
+        String blameParent = "";
+        String blameText = "blame";
+        if (view.getRevision().getName().equals(r.getSourceCommit().name())) {
+          blameParent = "^";
+          blameText = "blame^";
+        }
         e.put("blameUrl", GitilesView.blame().copyFrom(view)
-            .setRevision(r.getSourceCommit().name())
+            .setRevision(r.getSourceCommit().name() + blameParent)
             .setPathPart(r.getSourcePath())
             .toUrl());
+        e.put("blameText", blameText);
         e.put("commitUrl", GitilesView.revision().copyFrom(view)
             .setRevision(r.getSourceCommit().name())
             .toUrl());
diff --git a/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy b/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy
index a35b6e2..f5110d8 100644
--- a/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy
+++ b/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy
@@ -55,7 +55,7 @@
           <td class="Blame-time">{$region.author.time}</span>
           <td class="Blame-regionLink">
             [<a href="{$region.diffUrl}">{msg desc="text for diff URL"}diff{/msg}</a>]
-            [<a href="{$region.blameUrl}">{msg desc="text for blame URL"}blame{/msg}</a>]
+            [<a href="{$region.blameUrl}">{msg desc="text for blame URL"}{$region.blameText}{/msg}</a>]
           </td>
         {else}
           <td colspan="4"></td>
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
index 56f1c29..2eadf54 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
@@ -83,11 +83,11 @@
     repo.getRevWalk().parseBody(c1);
     repo.getRevWalk().parseBody(c2);
 
-    Log response = buildJson(LOG, "/repo/+log/master/bar");
+    Log response = buildJson(LOG, "/repo/+log/master/bar", "follow=0");
     assertThat(response.log).hasSize(1);
     verifyJsonCommit(response.log.get(0), c2);
 
-    response = buildJson(LOG, "/repo/+log/master/bar", "follow=1");
+    response = buildJson(LOG, "/repo/+log/master/bar");
     assertThat(response.log).hasSize(2);
     verifyJsonCommit(response.log.get(0), c2);
     verifyJsonCommit(response.log.get(1), c1);
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
index 8f6224a..01de750 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
@@ -19,6 +19,7 @@
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 import static javax.servlet.http.HttpServletResponse.SC_OK;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import com.google.common.net.HttpHeaders;
 import com.google.gson.FieldNamingPolicy;
@@ -29,10 +30,16 @@
 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
 import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.MockSystemReader;
 import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.SystemReader;
+import org.junit.After;
 import org.junit.Before;
 
 import java.util.Map;
+import java.util.TimeZone;
 
 /** Base class for servlet tests. */
 public class ServletTest {
@@ -41,11 +48,18 @@
 
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<DfsRepository>(
-        new InMemoryRepository(new DfsRepositoryDescription("repo")));
+    MockSystemReader mockSystemReader = new MockSystemReader();
+    SystemReader.setInstance(mockSystemReader);
+    DfsRepository r = new InMemoryRepository(new DfsRepositoryDescription("repo"));
+    repo = new TestRepository<>(r, new RevWalk(r), mockSystemReader);
     servlet = TestGitilesServlet.create(repo);
   }
 
+  @After
+  public void tearDown() {
+      SystemReader.setInstance(null);
+  }
+
   protected FakeHttpServletResponse buildResponse(
       String path, String queryString, int expectedStatus)
       throws Exception {
@@ -128,6 +142,11 @@
         .create();
   }
 
+  protected String currentTimeFormatted() {
+    PersonIdent p = new PersonIdent(repo.getRepository());
+    return new DateFormatter(Optional.<TimeZone>absent(), DateFormatter.Format.ISO).format(p);
+  }
+
   protected void assertNotFound(String path, String queryString) throws Exception {
     buildResponse(path, queryString, SC_NOT_FOUND);
   }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
index bc4e553..7100359 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/TimeCacheTest.java
@@ -55,7 +55,7 @@
         new InMemoryRepository(new DfsRepositoryDescription("test")));
     walk = new RevWalk(repo.getRepository());
     cache = new TimeCache();
-    start = repo.getClock().getTime() / 1000;
+    start = repo.getDate().getTime() / 1000;
   }
 
   private long getTime(ObjectId id) throws IOException {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
index 03a962f..f4fb859 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
@@ -31,6 +31,8 @@
 
 @RunWith(JUnit4.class)
 public class BlameServletTest extends ServletTest {
+  private static final String NAME = "J. Author";
+  private static final String EMAIL = "[email protected]";
   private static class RegionJsonData {
     int start;
     int count;
@@ -44,7 +46,10 @@
     String contents1 = "foo\n";
     String contents2 = "foo\ncontents\n";
     RevCommit c1 = repo.update("master", repo.commit().add("foo", contents1));
-    RevCommit c2 = repo.update("master", repo.commit().tick(10).parent(c1).add("foo", contents2));
+    String c1Time = currentTimeFormatted();
+    RevCommit c2 = repo.update("master",
+        repo.commit().tick(10).parent(c1).add("foo", contents2));
+    String c2Time = currentTimeFormatted();
 
     Map<String, List<RegionJsonData>> result = getBlameJson("/repo/+blame/" + c2.name() + "/foo");
     assertThat(Iterables.getOnlyElement(result.keySet())).isEqualTo("regions");
@@ -56,18 +61,18 @@
     assertThat(r1.count).isEqualTo(1);
     assertThat(r1.path).isEqualTo("foo");
     assertThat(r1.commit).isEqualTo(c1.name());
-    assertThat(r1.author.name).isEqualTo("J. Author");
-    assertThat(r1.author.email).isEqualTo("[email protected]");
-    assertThat(r1.author.time).isEqualTo("2009-03-13 17:29:48 -0330");
+    assertThat(r1.author.name).isEqualTo(NAME);
+    assertThat(r1.author.email).isEqualTo(EMAIL);
+    assertThat(r1.author.time).isEqualTo(c1Time);
 
     RegionJsonData r2 = regions.get(1);
     assertThat(r2.start).isEqualTo(2);
     assertThat(r2.count).isEqualTo(1);
     assertThat(r2.path).isEqualTo("foo");
     assertThat(r2.commit).isEqualTo(c2.name());
-    assertThat(r2.author.name).isEqualTo("J. Author");
-    assertThat(r2.author.email).isEqualTo("[email protected]");
-    assertThat(r2.author.time).isEqualTo("2009-03-13 17:29:58 -0330");
+    assertThat(r2.author.name).isEqualTo(NAME);
+    assertThat(r2.author.email).isEqualTo(EMAIL);
+    assertThat(r2.author.time).isEqualTo(c2Time);
   }
 
   private Map<String, List<RegionJsonData>> getBlameJson(String path) throws Exception {
diff --git a/lib/jgit/BUCK b/lib/jgit/BUCK
index bced6fb..8da5493 100644
--- a/lib/jgit/BUCK
+++ b/lib/jgit/BUCK
@@ -1,10 +1,10 @@
-REPO = MAVEN_CENTRAL
-VERS = '4.0.1.201506240215-r'
+REPO = GERRIT # Leave here even if set to MAVEN_CENTRAL.
+VERS = '4.2.0.201601211800-r.136-g8efdaaf'
 
 maven_jar(
   name = 'jgit',
   id = 'org.eclipse.jgit:org.eclipse.jgit:' + VERS,
-  sha1 = '3bdf2d666df1a5373f7ad291c075ab1329560afd',
+  sha1 = '32f50e3c0c4f53d8fdca147d3ff0b6ef0dc02eb0',
   repository = REPO,
   unsign = True,
   deps = [':ewah'],
@@ -18,7 +18,7 @@
 maven_jar(
   name = 'jgit-servlet',
   id = 'org.eclipse.jgit:org.eclipse.jgit.http.server:' + VERS,
-  sha1 = '8c73719477224802eda2a2da65bce8946d0fac6f',
+  sha1 = 'b493401b9778cdc38f7c08f111c6385a434b2ac2',
   repository = REPO,
   deps = [':jgit'],
   unsign = True,
@@ -41,7 +41,7 @@
 maven_jar(
   name = 'jgit-archive_library',
   id = 'org.eclipse.jgit:org.eclipse.jgit.archive:' + VERS,
-  sha1 = '124e353f51adbbc1af12b143012cc1ebfa2c1012',
+  sha1 = '1b3a0cb7b8c2629e33902b3daf1067accca62eaf',
   repository = REPO,
   deps = [':jgit'],
   unsign = True,
@@ -54,7 +54,7 @@
 maven_jar(
   name = 'junit',
   id = 'org.eclipse.jgit:org.eclipse.jgit.junit:' + VERS,
-  sha1 = 'bddb62b8f532b6d46ac832d909fa46b73c40a126',
+  sha1 = 'c68ddb3e2aaca05b1d2f8250dd107b5f484ed603',
   repository = REPO,
   unsign = True,
   deps = [':jgit'],