Swap the whole GitRepositoryManagerModule

Use functionality provided in [1] in order to provide support fot setups
with multi-base repositories functionality.

[1] https://gerrit-review.googlesource.com/c/gerrit/+/326778

Change-Id: I4464bdc97977b4f0d5d64e34b2b16dbdaff8f128
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedGitRepositoryManager.java b/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedGitRepositoryManager.java
index 0697306..5a222c3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedGitRepositoryManager.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedGitRepositoryManager.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.gerritcachedrefdb;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.LocalDiskRepositoryManager;
@@ -49,4 +50,9 @@
   public SortedSet<Project.NameKey> list() {
     return repoManager.list();
   }
+
+  @VisibleForTesting
+  LocalDiskRepositoryManager getRepoManager() {
+    return repoManager;
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/LibDbModule.java b/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/LibDbModule.java
index 3c857cf..21300d4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/LibDbModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/LibDbModule.java
@@ -17,13 +17,27 @@
 import static com.google.inject.Scopes.SINGLETON;
 
 import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.ModuleImpl;
+import com.google.gerrit.server.config.RepositoryConfig;
 import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.GitRepositoryManagerModule;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.gerrit.server.git.MultiBaseLocalDiskRepositoryManager;
+import com.google.inject.Inject;
 
-public class LibDbModule extends FactoryModule {
+@ModuleImpl(name = GitRepositoryManagerModule.MANAGER_MODULE)
+public class LibDbModule extends LifecycleModule {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
+  private final RepositoryConfig repoConfig;
+
+  @Inject
+  LibDbModule(RepositoryConfig repoConfig) {
+    this.repoConfig = repoConfig;
+  }
+
   @Override
   protected void configure() {
     DynamicItem.itemOf(binder(), RefByNameCache.class);
@@ -36,6 +50,12 @@
     factory(CachedRefRepository.Factory.class);
 
     bind(GitRepositoryManager.class).to(GerritCachedGitRepositoryManager.class);
+
+    // part responsible for physical repositories handling
+    listener().to(LocalDiskRepositoryManager.Lifecycle.class);
+    if (!repoConfig.getAllBasePaths().isEmpty()) {
+      bind(LocalDiskRepositoryManager.class).to(MultiBaseLocalDiskRepositoryManager.class);
+    }
     logger.atInfo().log("DB library loaded");
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedRefDbIT.java b/src/test/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedRefDbIT.java
index bf2ca31..a6168da 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedRefDbIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/gerritcachedrefdb/GerritCachedRefDbIT.java
@@ -21,6 +21,8 @@
 import com.google.gerrit.acceptance.UseLocalDisk;
 import com.google.gerrit.acceptance.config.GerritConfig;
 import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.gerrit.server.git.MultiBaseLocalDiskRepositoryManager;
 import com.google.inject.Inject;
 import org.junit.Test;
 
@@ -40,6 +42,23 @@
       value = "com.googlesource.gerrit.plugins.gerritcachedrefdb.LibSysModule")
   public void shouldBeAbleToInstallGerritCachedGitRepoManager() {
     assertThat(gitRepoManager).isInstanceOf(GerritCachedGitRepositoryManager.class);
+    assertThat(((GerritCachedGitRepositoryManager) gitRepoManager).getRepoManager().getClass())
+        .isEqualTo(LocalDiskRepositoryManager.class);
+    assertThat(refByNameCacheWrapper.cache()).isInstanceOf(RefByNameGerritCache.class);
+  }
+
+  @Test
+  @GerritConfig(
+      name = "gerrit.installDbModule",
+      value = "com.googlesource.gerrit.plugins.gerritcachedrefdb.LibDbModule")
+  @GerritConfig(
+      name = "gerrit.installModule",
+      value = "com.googlesource.gerrit.plugins.gerritcachedrefdb.LibSysModule")
+  @GerritConfig(name = "repository.r1.basePath", value = "/tmp/git1")
+  public void shouldMultiBaseRepoManagerBeUsedWhenConfigured() {
+    assertThat(gitRepoManager).isInstanceOf(GerritCachedGitRepositoryManager.class);
+    assertThat(((GerritCachedGitRepositoryManager) gitRepoManager).getRepoManager())
+        .isInstanceOf(MultiBaseLocalDiskRepositoryManager.class);
     assertThat(refByNameCacheWrapper.cache()).isInstanceOf(RefByNameGerritCache.class);
   }
 }