Merge changes from topic 'lucene5'

* changes:
  Update Lucene to 5.0.0
  Add config option to disable online reindexing
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index d4218a5..7397758 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -1,10 +1,9 @@
-#Wed Jul 29 11:31:38 PDT 2009
 eclipse.preferences.version=1
 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
 formatter_profile=_Google Format
 formatter_settings_version=11
 org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=com.google;com;junit;net;org;java;javax;
+org.eclipse.jdt.ui.importorder=\#;com.google;com;dk;eu;junit;net;org;java;javax;
 org.eclipse.jdt.ui.ondemandthreshold=99
 org.eclipse.jdt.ui.staticondemandthreshold=99
 org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
index 3e31aa6..e59ed4d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -64,6 +64,7 @@
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
@@ -127,8 +128,7 @@
   @Inject
   protected @GerritServerConfig Config cfg;
 
-  protected Git git;
-  protected TestRepository<?> testRepo;
+  protected TestRepository<InMemoryRepository> testRepo;
   protected GerritServer server;
   protected TestAccount admin;
   protected TestAccount user;
@@ -211,7 +211,7 @@
     project = new Project.NameKey(projectInput.name);
     createProject(projectInput);
 
-    setRepo(cloneProject(sshSession.getUrl() + "/" + project.get()));
+    testRepo = cloneProject(project, sshSession);
   }
 
   private ProjectInput projectInput(Description description) {
@@ -237,9 +237,12 @@
     return in;
   }
 
-  protected void setRepo(Git git) throws Exception {
-    this.git = git;
-    testRepo = new TestRepository<>(git.getRepository());
+  protected Git git() {
+    return testRepo.git();
+  }
+
+  protected InMemoryRepository repo() {
+    return testRepo.getRepository();
   }
 
   protected void createProject(String name) throws RestApiException {
@@ -291,7 +294,7 @@
   }
 
   protected TestRepository<?>.CommitBuilder amendBuilder() throws Exception {
-    ObjectId head = testRepo.getRepository().getRef("HEAD").getObjectId();
+    ObjectId head = repo().getRef("HEAD").getObjectId();
     TestRepository<?>.CommitBuilder b = testRepo.amendRef("HEAD");
     Optional<String> id = GitUtil.getChangeId(testRepo, head);
     // TestRepository behaves like "git commit --amend -m foo", which does not
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java
index e68279d..2cd2579 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GitUtil.java
@@ -16,21 +16,25 @@
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Iterables;
+import com.google.common.primitives.Ints;
 import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.testutil.TempFileUtil;
+import com.google.gerrit.reviewdb.client.Project;
 
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Session;
 
-import org.eclipse.jgit.api.CloneCommand;
 import org.eclipse.jgit.api.FetchCommand;
-import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.PushCommand;
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
 import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.FetchResult;
 import org.eclipse.jgit.transport.JschConfigSessionFactory;
 import org.eclipse.jgit.transport.OpenSshConfig.Host;
 import org.eclipse.jgit.transport.PushResult;
@@ -38,12 +42,15 @@
 import org.eclipse.jgit.transport.SshSessionFactory;
 import org.eclipse.jgit.util.FS;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 public class GitUtil {
+  private static final AtomicInteger testRepoCount = new AtomicInteger();
+  private static final int TEST_REPO_WINDOW_DAYS = 2;
 
   public static void initSsh(final TestAccount a) {
     final Properties config = new Properties();
@@ -67,33 +74,73 @@
     });
   }
 
-  public static Git cloneProject(String url) throws GitAPIException, IOException {
-    return cloneProject(url, true);
+  /**
+   * Create a new {@link TestRepository} with a distinct commit clock.
+   * <p>
+   * It is very easy for tests to create commits with identical subjects and
+   * trees; if such commits also have identical authors/committers, then the
+   * computed Change-Id is identical as well. Tests may generally assume that
+   * Change-Ids are unique, so to ensure this, we provision TestRepository
+   * instances with non-overlapping commit clock times.
+   * <p>
+   * Space test repos 1 day apart, which allows for about 86k ticks per repo
+   * before overlapping, and about 8k instances per process before hitting
+   * JGit's year 2038 limit.
+   *
+   * @param repo repository to wrap.
+   * @return wrapped test repository with distinct commit time space.
+   */
+  public static <R extends Repository> TestRepository<R> newTestRepository(
+      R repo) throws IOException {
+    TestRepository<R> tr = new TestRepository<>(repo);
+    tr.tick(Ints.checkedCast(TimeUnit.SECONDS.convert(
+        testRepoCount.getAndIncrement() * TEST_REPO_WINDOW_DAYS,
+        TimeUnit.DAYS)));
+    return tr;
   }
 
-  public static Git cloneProject(String url, boolean checkout) throws GitAPIException, IOException {
-    final File gitDir = TempFileUtil.createTempDirectory();
-    final CloneCommand cloneCmd = Git.cloneRepository();
-    cloneCmd.setURI(url);
-    cloneCmd.setDirectory(gitDir);
-    cloneCmd.setNoCheckout(!checkout);
-    return cloneCmd.call();
+  public static TestRepository<InMemoryRepository> cloneProject(
+      Project.NameKey project, String uri) throws Exception {
+    InMemoryRepository dest = new InMemoryRepository.Builder()
+        .setRepositoryDescription(new DfsRepositoryDescription(project.get()))
+        // SshTransport depends on a real FS to read ~/.ssh/config, but
+        // InMemoryRepository by default uses a null FS.
+        // TODO(dborowitz): Remove when we no longer depend on SSH.
+        .setFS(FS.detect())
+        .build();
+    Config cfg = dest.getConfig();
+    cfg.setString("remote", "origin", "url", uri);
+    cfg.setString("remote", "origin", "fetch",
+        "+refs/heads/*:refs/remotes/origin/*");
+    TestRepository<InMemoryRepository> testRepo = newTestRepository(dest);
+    FetchResult result = testRepo.git().fetch().setRemote("origin").call();
+    String originMaster = "refs/remotes/origin/master";
+    if (result.getTrackingRefUpdate(originMaster) != null) {
+      testRepo.reset(originMaster);
+    }
+    return testRepo;
   }
 
-  public static void fetch(Git git, String spec) throws GitAPIException {
-    FetchCommand fetch = git.fetch();
+  public static TestRepository<InMemoryRepository> cloneProject(
+      Project.NameKey project, SshSession sshSession) throws Exception {
+    return cloneProject(project, sshSession.getUrl() + "/" + project.get());
+  }
+
+  public static void fetch(TestRepository<?> testRepo, String spec)
+      throws GitAPIException {
+    FetchCommand fetch = testRepo.git().fetch();
     fetch.setRefSpecs(new RefSpec(spec));
     fetch.call();
   }
 
-  public static PushResult pushHead(Git git, String ref, boolean pushTags)
-      throws GitAPIException {
-    return pushHead(git, ref, pushTags, false);
+  public static PushResult pushHead(TestRepository<?> testRepo, String ref,
+      boolean pushTags) throws GitAPIException {
+    return pushHead(testRepo, ref, pushTags, false);
   }
 
-  public static PushResult pushHead(Git git, String ref, boolean pushTags,
-      boolean force) throws GitAPIException {
-    PushCommand pushCmd = git.push();
+  public static PushResult pushHead(TestRepository<?> testRepo, String ref,
+      boolean pushTags, boolean force) throws GitAPIException {
+    PushCommand pushCmd = testRepo.git().push();
     pushCmd.setForce(force);
     pushCmd.setRefSpecs(new RefSpec("HEAD:" + ref));
     if (pushTags) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
index ad3469f..041d2fd 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
@@ -36,7 +36,6 @@
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
 
-import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.TagCommand;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.ObjectId;
@@ -181,9 +180,8 @@
     if (changeId == null) {
       changeId = GitUtil.getChangeId(testRepo, c).get();
     }
-    Git git = Git.wrap(testRepo.getRepository());
     if (tag != null) {
-      TagCommand tagCommand = git.tag().setName(tag.name);
+      TagCommand tagCommand = testRepo.git().tag().setName(tag.name);
       if (tag instanceof AnnotatedTag) {
         AnnotatedTag annotatedTag = (AnnotatedTag)tag;
         tagCommand.setAnnotated(true)
@@ -194,7 +192,8 @@
       }
       tagCommand.call();
     }
-    return new Result(ref, pushHead(git, ref, tag != null, force), c, subject);
+    return new Result(ref, pushHead(testRepo, ref, tag != null, force), c,
+        subject);
   }
 
   public void setTag(final Tag tag) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
index b74bf34..665c98e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -311,7 +311,7 @@
     assertThat(canRebase).isFalse();
     merge(r2);
 
-    git.checkout().setName(r1.getCommit().name()).call();
+    testRepo.reset(r1.getCommit());
     push = pushFactory.create(db, admin.getIdent(), testRepo);
     PushOneCommit.Result r3 = push.to("refs/for/master");
 
@@ -349,7 +349,7 @@
 
   @Test
   public void mergeable() throws Exception {
-    ObjectId initial = git.getRepository().getRef(HEAD).getLeaf().getObjectId();
+    ObjectId initial = repo().getRef(HEAD).getLeaf().getObjectId();
 
     PushOneCommit push1 =
         pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
@@ -360,7 +360,7 @@
     merge(r1);
 
     // Reset HEAD to initial so the new change is a merge conflict.
-    RefUpdate ru = git.getRepository().updateRef(HEAD);
+    RefUpdate ru = repo().updateRef(HEAD);
     ru.setNewObjectId(initial);
     assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
index 126e2ff..eeba450 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
@@ -267,7 +267,8 @@
   @Test
   @TestProjectInput(createEmptyCommit = false)
   public void updateRootCommitMessage() throws Exception {
-    setRepo(cloneProject(sshSession.getUrl() + "/" + project));
+    // Re-clone empty repo; TestRepository doesn't let us reset to unborn head.
+    testRepo = cloneProject(project, sshSession);
     changeId = newChange(admin.getIdent());
     change = getChange(changeId);
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
index 482a494..8a35567 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
@@ -68,7 +68,7 @@
       default:
         throw new IllegalArgumentException("unexpected protocol: " + p);
     }
-    setRepo(cloneProject(url + "/" + project.get()));
+    testRepo = cloneProject(project, url + "/" + project.get());
   }
 
   @Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
index 44ddb94..26db819 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
@@ -29,14 +29,14 @@
 
   @Test
   public void forcePushNotAllowed() throws Exception {
-    ObjectId initial = git.getRepository().getRef(HEAD).getLeaf().getObjectId();
+    ObjectId initial = repo().getRef(HEAD).getLeaf().getObjectId();
     PushOneCommit push1 =
         pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
     PushOneCommit.Result r1 = push1.to("refs/heads/master");
     r1.assertOkStatus();
 
     // Reset HEAD to initial so the new change is a non-fast forward
-    RefUpdate ru = git.getRepository().updateRef(HEAD);
+    RefUpdate ru = repo().updateRef(HEAD);
     ru.setNewObjectId(initial);
     assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
 
@@ -49,7 +49,7 @@
 
   @Test
   public void forcePushAllowed() throws Exception {
-    ObjectId initial = git.getRepository().getRef(HEAD).getLeaf().getObjectId();
+    ObjectId initial = repo().getRef(HEAD).getLeaf().getObjectId();
     grant(Permission.PUSH, project, "refs/*", true);
     PushOneCommit push1 =
         pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
@@ -57,7 +57,7 @@
     r1.assertOkStatus();
 
     // Reset HEAD to initial so the new change is a non-fast forward
-    RefUpdate ru = git.getRepository().updateRef(HEAD);
+    RefUpdate ru = repo().updateRef(HEAD);
     ru.setNewObjectId(initial);
     assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
index ed6e6e7..559491d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
@@ -103,9 +103,8 @@
   public void submitOnPushToRefsMetaConfig() throws Exception {
     grant(Permission.SUBMIT, project, "refs/for/refs/meta/config");
 
-    git.fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
-    ObjectId objectId = git.getRepository().getRef("refs/meta/config").getObjectId();
-    git.checkout().setName(objectId.getName()).call();
+    git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
+    testRepo.reset("refs/meta/config");
 
     PushOneCommit.Result r = pushTo("refs/for/refs/meta/config%submit");
     r.assertOkStatus();
@@ -116,10 +115,9 @@
 
   @Test
   public void submitOnPushMergeConflict() throws Exception {
-    String master = "refs/heads/master";
-    ObjectId objectId = git.getRepository().getRef(master).getObjectId();
-    push(master, "one change", "a.txt", "some content");
-    git.checkout().setName(objectId.getName()).call();
+    ObjectId objectId = repo().getRef("HEAD").getObjectId();
+    push("refs/heads/master", "one change", "a.txt", "some content");
+    testRepo.reset(objectId);
 
     grant(Permission.SUBMIT, project, "refs/for/refs/heads/master");
     PushOneCommit.Result r =
@@ -132,9 +130,9 @@
   @Test
   public void submitOnPushSuccessfulMerge() throws Exception {
     String master = "refs/heads/master";
-    ObjectId objectId = git.getRepository().getRef(master).getObjectId();
+    ObjectId objectId = repo().getRef("HEAD").getObjectId();
     push(master, "one change", "a.txt", "some content");
-    git.checkout().setName(objectId.getName()).call();
+    testRepo.reset(objectId);
 
     grant(Permission.SUBMIT, project, "refs/for/refs/heads/master");
     PushOneCommit.Result r =
@@ -197,7 +195,7 @@
         push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content");
     r.assertOkStatus();
 
-    git.push()
+    git().push()
         .setRefSpecs(new RefSpec(r.getCommitId().name() + ":refs/heads/master"))
         .call();
     assertCommit(project, "refs/heads/master");
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index ee930bb..6bcc54b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -57,8 +57,8 @@
 import com.google.inject.Inject;
 
 import org.apache.http.HttpStatus;
-import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
@@ -279,17 +279,17 @@
     assertThat(submitter.getAccountId()).isEqualTo(admin.getId());
   }
 
-  protected void assertCherryPick(Git localGit, boolean contentMerge)
-      throws IOException {
-    assertRebase(localGit, contentMerge);
+  protected void assertCherryPick(TestRepository<?> testRepo,
+      boolean contentMerge) throws IOException {
+    assertRebase(testRepo, contentMerge);
     RevCommit remoteHead = getRemoteHead();
     assertThat(remoteHead.getFooterLines("Reviewed-On")).isNotEmpty();
     assertThat(remoteHead.getFooterLines("Reviewed-By")).isNotEmpty();
   }
 
-  protected void assertRebase(Git localGit, boolean contentMerge)
+  protected void assertRebase(TestRepository<?> testRepo, boolean contentMerge)
       throws IOException {
-    Repository repo = localGit.getRepository();
+    Repository repo = testRepo.getRepository();
     RevCommit localHead = getHead(repo);
     RevCommit remoteHead = getRemoteHead();
     assert_().withFailureMessage(
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
index 65fdd0f..95c70ad 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
@@ -53,7 +53,7 @@
     SshSession sshSession = new SshSession(server, user);
     initSsh(user);
     sshSession.open();
-    setRepo(cloneProject(sshSession.getUrl() + "/" + project.get()));
+    testRepo = cloneProject(project, sshSession);
     sshSession.close();
     user2 = accounts.user2();
     sessionDev = new RestSession(server, user2);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
index 3152139..c00a260 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
@@ -41,7 +41,7 @@
   public void submitWithCherryPickIfFastForwardPossible() throws Exception {
     PushOneCommit.Result change = createChange();
     submit(change.getChangeId());
-    assertCherryPick(git, false);
+    assertCherryPick(testRepo, false);
     assertThat(getRemoteHead().getParent(0))
       .isEqualTo(change.getCommit().getParent(0));
   }
@@ -58,7 +58,7 @@
     PushOneCommit.Result change2 =
         createChange("Change 2", "b.txt", "other content");
     submit(change2.getChangeId());
-    assertCherryPick(git, false);
+    assertCherryPick(testRepo, false);
     RevCommit newHead = getRemoteHead();
     assertThat(newHead.getParentCount()).isEqualTo(1);
     assertThat(newHead.getParent(0)).isEqualTo(oldHead);
@@ -82,7 +82,7 @@
     PushOneCommit.Result change3 =
         createChange("Change 3", "a.txt", "bbb\nccc\n");
     submit(change3.getChangeId());
-    assertCherryPick(git, true);
+    assertCherryPick(testRepo, true);
     RevCommit newHead = getRemoteHead();
     assertThat(newHead.getParent(0)).isEqualTo(oldHead);
     assertApproved(change3.getChangeId());
@@ -122,7 +122,7 @@
     PushOneCommit.Result change3 =
         createChange("Change 3", "c.txt", "different content");
     submit(change3.getChangeId());
-    assertCherryPick(git, false);
+    assertCherryPick(testRepo, false);
     RevCommit newHead = getRemoteHead();
     assertThat(newHead.getParent(0)).isEqualTo(oldHead);
     assertApproved(change3.getChangeId());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
index 6d5db92..bb26a30 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
@@ -58,7 +58,7 @@
     PushOneCommit.Result change2 =
         createChange("Change 2", "b.txt", "other content");
     submit(change2.getChangeId());
-    assertRebase(git, false);
+    assertRebase(testRepo, false);
     RevCommit head = getRemoteHead();
     assertThat(head.getParent(0)).isEqualTo(oldHead);
     assertApproved(change2.getChangeId());
@@ -82,7 +82,7 @@
     PushOneCommit.Result change3 =
         createChange("Change 3", "a.txt", "bbb\nccc\n");
     submit(change3.getChangeId());
-    assertRebase(git, true);
+    assertRebase(testRepo, true);
     RevCommit head = getRemoteHead();
     assertThat(head.getParent(0)).isEqualTo(oldHead);
     assertApproved(change3.getChangeId());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
index f59004a..682059c 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
@@ -45,7 +45,7 @@
     assertThat(info.alreadyBanned).isNull();
     assertThat(info.ignored).isNull();
 
-    PushResult pushResult = pushHead(git, "refs/heads/master", false);
+    PushResult pushResult = pushHead(testRepo, "refs/heads/master", false);
     assertThat(pushResult.getRemoteUpdate("refs/heads/master").getMessage())
         .startsWith("contains banned commit");
   }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
index 8e627c4..038a208 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
@@ -19,6 +19,7 @@
 
 import com.google.common.collect.Iterables;
 import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
 import com.google.gerrit.acceptance.PushOneCommit;
 import com.google.gerrit.acceptance.RestResponse;
 import com.google.gerrit.common.data.AccessSection;
@@ -40,7 +41,7 @@
 
   @Before
   public void setUp() throws Exception {
-    repo = new TestRepository<>(repoManager.openRepository(project));
+    repo = GitUtil.newTestRepository(repoManager.openRepository(project));
 
     ProjectConfig pc = projectCache.checkedGet(allProjects).getConfig();
     for (AccessSection sec : pc.getAccessSections()) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
index 0153666..3f27272 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
@@ -61,15 +61,15 @@
   @Test
   public void listBranches() throws Exception {
     pushTo("refs/heads/master");
-    String masterCommit = git.getRepository().getRef("master").getTarget().getObjectId().getName();
+    String headCommit = repo().getRef("HEAD").getTarget().getObjectId().getName();
     pushTo("refs/heads/dev");
-    String devCommit = git.getRepository().getRef("master").getTarget().getObjectId().getName();
+    String devCommit = repo().getRef("HEAD").getTarget().getObjectId().getName();
     RestResponse r = adminSession.get("/projects/" + project.get() + "/branches");
     List<BranchInfo> expected = Lists.asList(
         new BranchInfo("refs/meta/config",  null, false),
         new BranchInfo[] {
           new BranchInfo("HEAD", "master", false),
-          new BranchInfo("refs/heads/master", masterCommit, false),
+          new BranchInfo("refs/heads/master", headCommit, false),
           new BranchInfo("refs/heads/dev", devCommit, true)
         });
     List<BranchInfo> result = toBranchInfoList(r);
@@ -86,14 +86,14 @@
   public void listBranchesSomeHidden() throws Exception {
     blockRead(project, "refs/heads/dev");
     pushTo("refs/heads/master");
-    String masterCommit = git.getRepository().getRef("master").getTarget().getObjectId().getName();
+    String headCommit = repo().getRef("HEAD").getTarget().getObjectId().getName();
     pushTo("refs/heads/dev");
     RestResponse r = userSession.get("/projects/" + project.get() + "/branches");
     // refs/meta/config is hidden since user is no project owner
     List<BranchInfo> expected = Lists.asList(
         new BranchInfo("HEAD", "master", false),
         new BranchInfo[] {
-          new BranchInfo("refs/heads/master", masterCommit, false),
+          new BranchInfo("refs/heads/master", headCommit, false),
         });
     assertBranches(expected, toBranchInfoList(r));
   }
@@ -103,7 +103,7 @@
     blockRead(project, "refs/heads/master");
     pushTo("refs/heads/master");
     pushTo("refs/heads/dev");
-    String devCommit = git.getRepository().getRef("master").getTarget().getObjectId().getName();
+    String devCommit = repo().getRef("HEAD").getTarget().getObjectId().getName();
     RestResponse r = userSession.get("/projects/" + project.get() + "/branches");
     // refs/meta/config is hidden since user is no project owner
     assertBranches(Collections.singletonList(new BranchInfo("refs/heads/dev",
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
index ceca9d9..660bbbc 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
@@ -23,7 +23,6 @@
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.project.ProjectState;
 
-import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.Config;
 import org.junit.Before;
@@ -32,7 +31,7 @@
 public class ProjectLevelConfigIT extends AbstractDaemonTest {
   @Before
   public void setUp() throws Exception {
-    fetch(git, RefNames.REFS_CONFIG + ":refs/heads/config");
+    fetch(testRepo, RefNames.REFS_CONFIG + ":refs/heads/config");
     testRepo.reset("refs/heads/config");
   }
 
@@ -68,11 +67,8 @@
     parentCfg.setString("s2", "ss", "k3", "parentValue3");
     parentCfg.setString("s2", "ss", "k4", "parentValue4");
 
-    Git parentGit =
-        cloneProject(sshSession.getUrl() + "/" + allProjects.get(), false);
-    TestRepository<?> parentTestRepo =
-        new TestRepository<>(parentGit.getRepository());
-    fetch(parentGit, RefNames.REFS_CONFIG + ":refs/heads/config");
+    TestRepository<?> parentTestRepo = cloneProject(allProjects, sshSession);
+    fetch(parentTestRepo, RefNames.REFS_CONFIG + ":refs/heads/config");
     parentTestRepo.reset("refs/heads/config");
     PushOneCommit push =
         pushFactory.create(db, admin.getIdent(), parentTestRepo, "Create Project Level Config",
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
index 4b05d79..d4268ee 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
@@ -67,7 +67,7 @@
         .message("subject: 2")
         .create();
     String id2 = getChangeId(testRepo, c2).get();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     for (RevCommit c : ImmutableList.of(c2, c1)) {
       List<ChangeAndCommit> related = getRelated(getPatchSetId(c));
@@ -93,14 +93,15 @@
         .message("subject: 2")
         .create();
     String id2 = getChangeId(testRepo, c2).get();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
     PatchSet.Id c1ps1 = getPatchSetId(c1);
     PatchSet.Id c2ps1 = getPatchSetId(c2);
 
     // Swap the order of commits and push again.
     testRepo.reset("HEAD~2");
-    git.cherryPick().include(c2).include(c1).call();
-    pushHead(git, "refs/for/master", false);
+    testRepo.cherryPick(c2);
+    testRepo.cherryPick(c1);
+    pushHead(testRepo, "refs/for/master", false);
     PatchSet.Id c1ps2 = getPatchSetId(c1);
     PatchSet.Id c2ps2 = getPatchSetId(c2);
 
@@ -126,7 +127,7 @@
   @Test
   public void getRelatedReorderAndExtend() throws Exception {
     // Create two commits and push.
-    ObjectId initial = testRepo.getRepository().getRef("HEAD").getObjectId();
+    ObjectId initial = repo().getRef("HEAD").getObjectId();
     RevCommit c1 = commitBuilder()
         .add("a.txt", "1")
         .message("subject: 1")
@@ -137,19 +138,20 @@
         .message("subject: 2")
         .create();
     String id2 = getChangeId(testRepo, c2).get();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
     PatchSet.Id c1ps1 = getPatchSetId(c1);
     PatchSet.Id c2ps1 = getPatchSetId(c2);
 
     // Swap the order of commits, create a new commit on top, and push again.
     testRepo.reset(initial);
-    git.cherryPick().include(c2).include(c1).call();
+    testRepo.cherryPick(c2);
+    testRepo.cherryPick(c1);
     RevCommit c3 = commitBuilder()
         .add("c.txt", "3")
         .message("subject: 3")
         .create();
     String id3 = getChangeId(testRepo, c3).get();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
     PatchSet.Id c1ps2 = getPatchSetId(c1);
     PatchSet.Id c2ps2 = getPatchSetId(c2);
     PatchSet.Id c3ps1 = getPatchSetId(c3);
@@ -195,7 +197,7 @@
         .message("subject: 3")
         .create();
     String id3 = getChangeId(testRepo, c3).get();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     Change ch2 = getChange(c2).change();
     editModifier.createEdit(ch2, getPatchSet(ch2));
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
index cb0818f..57b00bc 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
@@ -55,7 +55,7 @@
         .add(FILE_D, "4")
         .message(SUBJECT_1)
         .create();
-    pushHead(git, "refs/heads/master", false);
+    pushHead(testRepo, "refs/heads/master", false);
 
     // Change 1, 1 (+FILE_A, -FILE_D)
     RevCommit c = commitBuilder()
@@ -65,7 +65,7 @@
         .insertChangeId()
         .create();
     String id = getChangeId(testRepo, c).get();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Compare Change 1,1 with Base (+FILE_A, -FILE_D)
     List<PatchListEntry> entries = getCurrentPatches(id);
@@ -78,7 +78,7 @@
     c = amendBuilder()
         .add(FILE_B, "2")
         .create();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
     entries = getCurrentPatches(id);
 
     // Compare Change 1,2 with Base (+FILE_A, +FILE_B, -FILE_D)
@@ -95,7 +95,7 @@
         .add(FILE_D, "4")
         .message(SUBJECT_1)
         .create();
-    pushHead(git, "refs/heads/master", false);
+    pushHead(testRepo, "refs/heads/master", false);
 
     // Change 1,1 (+FILE_A, -FILE_D)
     RevCommit c = commitBuilder()
@@ -104,7 +104,7 @@
         .message(SUBJECT_2)
         .create();
     String id = getChangeId(testRepo, c).get();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
     List<PatchListEntry> entries = getCurrentPatches(id);
     assertThat(entries).hasSize(3);
     assertAdded(Patch.COMMIT_MSG, entries.get(0));
@@ -117,11 +117,11 @@
         .add(FILE_B, "2")
         .message(SUBJECT_3)
         .create();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Change 1,2 (+FILE_A, -FILE_D))
-    git.cherryPick().include(c).call();
-    pushHead(git, "refs/for/master", false);
+    testRepo.cherryPick(c);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Compare Change 1,2 with Base (+FILE_A, -FILE_D))
     entries = getCurrentPatches(id);
@@ -137,7 +137,7 @@
         .add(FILE_D, "4")
         .message(SUBJECT_1)
         .create();
-    pushHead(git, "refs/heads/master", false);
+    pushHead(testRepo, "refs/heads/master", false);
 
     // Change 1,1 (+FILE_A, +FILE_C, -FILE_D)
     RevCommit a = commitBuilder()
@@ -146,14 +146,14 @@
         .rm(FILE_D)
         .message(SUBJECT_2)
         .create();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Change 1,2 (+FILE_A, +FILE_B, -FILE_D)
     RevCommit b = amendBuilder()
         .add(FILE_B, "2")
         .rm(FILE_C)
         .create();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Compare Change 1,1 with Change 1,2 (+FILE_B)
     List<PatchListEntry>  entries = getPatches(a, b);
@@ -168,7 +168,7 @@
         .add(FILE_D, "4")
         .message(SUBJECT_1)
         .create();
-    pushHead(git, "refs/heads/master", false);
+    pushHead(testRepo, "refs/heads/master", false);
 
     // Change 1,1 (+FILE_A, -FILE_D)
     RevCommit a = commitBuilder()
@@ -176,7 +176,7 @@
         .rm(FILE_D)
         .message(SUBJECT_2)
         .create();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Change 2,1 (+FILE_B)
     testRepo.reset("HEAD~1");
@@ -184,14 +184,14 @@
         .add(FILE_B, "2")
         .message(SUBJECT_3)
         .create();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Change 1,2 (+FILE_A, +FILE_C, -FILE_D)
-    git.cherryPick().include(a).call();
+    testRepo.cherryPick(a);
     RevCommit b = amendBuilder()
         .add(FILE_C, "2")
         .create();
-    pushHead(git, "refs/for/master", false);
+    pushHead(testRepo, "refs/for/master", false);
 
     // Compare Change 1,1 with Change 1,2 (+FILE_C)
     List<PatchListEntry>  entries = getPatches(a, b);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
index 0458f06..73d9c89 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
@@ -189,7 +189,7 @@
     PushOneCommit.Result r2 = push.to("refs/for/master");
     merge(r2);
 
-    git.checkout().setName(r1.getCommit().name()).call();
+    testRepo.reset(r1.getCommit());
     push = pushFactory.create(db, admin.getIdent(), testRepo, subject, file, contents);
     PushOneCommit.Result r3 = push.to("refs/for/master");
     revision(r3).review(ReviewInput.recommend());
@@ -216,7 +216,7 @@
     PushOneCommit.Result r2 = push.to("refs/for/master");
     merge(r2);
 
-    git.checkout().setName(r1.getCommit().name()).call();
+    testRepo.reset(r1.getCommit());
     push = pushFactory.create(db, admin.getIdent(), testRepo, subject, file, contents);
     PushOneCommit.Result r3 = push.to("refs/for/master");
     revision(r3).review(ReviewInput.recommend());
@@ -232,7 +232,7 @@
     saveLabelConfig();
 
     PushOneCommit.Result r1 = createChange();
-    git.checkout().setName(r1.getCommit().name()).call();
+    testRepo.reset(r1.getCommit());
 
     PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
         PushOneCommit.SUBJECT, "b.txt", "other contents");
@@ -262,7 +262,7 @@
 
     PushOneCommit.Result r1 = createChange();
 
-    git.checkout().setName(r1.getCommit().name()).call();
+    testRepo.reset(r1.getCommit());
 
     PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
         PushOneCommit.SUBJECT, "b.txt", "other contents");
@@ -303,7 +303,7 @@
     PushOneCommit.Result basePlusMMinusM = push.to("refs/for/master");
     merge(basePlusMMinusM);
 
-    git.checkout().setName(base.getCommit().name()).call();
+    testRepo.reset(base.getCommit());
     push = pushFactory.create(db, admin.getIdent(), testRepo,
         PushOneCommit.SUBJECT, file, contents + "MM");
     PushOneCommit.Result patchSet = push.to("refs/for/master");
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java
index 885b044..3bef84b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java
@@ -42,7 +42,7 @@
         .that(sshSession.hasError()).isFalse();
     assertThat(response.toLowerCase(Locale.US)).doesNotContain("error");
 
-    PushResult pushResult = pushHead(git, "refs/heads/master", false);
+    PushResult pushResult = pushHead(testRepo, "refs/heads/master", false);
     assertThat(pushResult.getRemoteUpdate("refs/heads/master").getMessage())
         .startsWith("contains banned commit");
   }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java
index 27a70b0..4f8a334 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/JschVerifyFalseBugIT.java
@@ -19,6 +19,7 @@
 
 import com.google.gerrit.acceptance.AbstractDaemonTest;
 import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.reviewdb.client.Project;
 
 import org.junit.Ignore;
 import org.junit.Test;
@@ -50,7 +51,7 @@
         for (int i = 1; i < 100; i++) {
           String p = "p" + i;
           createProject(p);
-          cloneProject(sshSession.getUrl() + "/" + p);
+          cloneProject(new Project.NameKey(p), sshSession);
         }
         return null;
       }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
index ce4776f..f2bda5b8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
@@ -42,7 +42,6 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-
 import java.util.ArrayList;
 
 @Singleton
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
index 922c2c4..2e09084 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
@@ -34,6 +34,9 @@
 import com.google.inject.Inject;
 import com.google.inject.util.Providers;
 
+import dk.brics.automaton.RegExp;
+import dk.brics.automaton.RunAutomaton;
+
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Ref;
@@ -51,9 +54,6 @@
 import java.util.Set;
 import java.util.TreeMap;
 
-import dk.brics.automaton.RegExp;
-import dk.brics.automaton.RunAutomaton;
-
 public class ListBranches implements RestReadView<ProjectResource> {
   private final GitRepositoryManager repoManager;
   private final DynamicMap<RestView<BranchResource>> branchViews;
diff --git a/lib/jgit/BUCK b/lib/jgit/BUCK
index a658fc3..acb96fb 100644
--- a/lib/jgit/BUCK
+++ b/lib/jgit/BUCK
@@ -1,13 +1,13 @@
 include_defs('//lib/maven.defs')
 
 REPO = GERRIT  # Leave here even if set to MAVEN_CENTRAL.
-VERS = '3.7.0.201502260915-r.58-g65c379e'
+VERS = '3.7.0.201502260915-r.63-gf1a15f7'
 
 maven_jar(
   name = 'jgit',
   id = 'org.eclipse.jgit:org.eclipse.jgit:' + VERS,
-  bin_sha1 = '8fc9620ec499169facad3355f7417eb6a8aff511',
-  src_sha1 = '40bd9ae8af8e0b03eb4e43f44f5feda8b7325221',
+  bin_sha1 = 'f0690b06d4270cc823b03ca88fb996897edbc410',
+  src_sha1 = 'c0b8232d4c5e8422198b35a90409c9826af68fa3',
   license = 'jgit',
   repository = REPO,
   unsign = True,
@@ -22,7 +22,7 @@
 maven_jar(
   name = 'jgit-servlet',
   id = 'org.eclipse.jgit:org.eclipse.jgit.http.server:' + VERS,
-  sha1 = 'cecc2b9c0b94455348c3a0c63eb83f72cc595757',
+  sha1 = '1284d550981a037ffe92441faf5d16cdfc09396d',
   license = 'jgit',
   repository = REPO,
   deps = [':jgit'],
@@ -36,7 +36,7 @@
 maven_jar(
   name = 'jgit-archive',
   id = 'org.eclipse.jgit:org.eclipse.jgit.archive:' + VERS,
-  sha1 = '7ccc7c78bf47566045ea7a3c08508ba18e4684ca',
+  sha1 = '6d96c9c27cb85c6db165b160fb0e8038b66b764a',
   license = 'jgit',
   repository = REPO,
   deps = [':jgit',
@@ -53,7 +53,7 @@
 maven_jar(
   name = 'junit',
   id = 'org.eclipse.jgit:org.eclipse.jgit.junit:' + VERS,
-  sha1 = '87d64d722447dc3971ace30d2a72593c72a4d05f',
+  sha1 = '48e25624fda973f2e9b7fa70a5204ee7a72e1bb3',
   license = 'DO_NOT_DISTRIBUTE',
   repository = REPO,
   unsign = True,
diff --git a/tools/gerrit.importorder b/tools/gerrit.importorder
index 831c5fe..398130e 100644
--- a/tools/gerrit.importorder
+++ b/tools/gerrit.importorder
@@ -1,9 +1,12 @@
 #Organize Import Order
-#Wed Jan 14 10:19:45 JST 2015
-6=javax
-5=java
-4=org
-3=net
-2=junit
-1=com
-0=com.google
+#Mon Mar 23 17:27:34 PDT 2015
+9=javax
+8=java
+7=org
+6=net
+5=junit
+4=eu
+3=dk
+2=com
+1=com.google
+0=\#