Fix init of new site Initializing a new site failed with: fatal: 1) Error injecting constructor, java.lang.IllegalStateException: gerrit.basePath must be configured fatal: at com.google.gerrit.server.git.LocalDiskRepositoryManager.<init>(LocalDiskRepositoryManager.java:118) fatal: at com.google.gerrit.server.git.LocalDiskRepositoryManager.class(LocalDiskRepositoryManager.java:55) fatal: while locating com.google.gerrit.server.git.LocalDiskRepositoryManager fatal: while locating com.google.gerrit.server.git.GitRepositoryManager fatal: Caused by: java.lang.IllegalStateException: gerrit.basePath must be configured fatal: at com.google.gerrit.server.git.LocalDiskRepositoryManager.<init>(LocalDiskRepositoryManager.java:121) fatal: at com.google.gerrit.server.git.LocalDiskRepositoryManager$$FastClassByGuice$$341d02c5.newInstance(<generated>) .... We can't use LocalDiskRepositoryManager since gerrit.basePath may not be set when it is created. Change-Id: I368ad324141ea74a82c3406bc2895e89bc55b743 Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java index 60031a8..49fd1f9 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
@@ -36,11 +36,9 @@ import com.google.gerrit.pgm.util.SiteProgram; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.config.GerritServerConfigModule; -import com.google.gerrit.server.config.RepositoryConfig; import com.google.gerrit.server.config.SitePath; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.GitRepositoryManager; -import com.google.gerrit.server.git.GitRepositoryManagerModule; import com.google.gerrit.server.index.IndexModule; import com.google.gerrit.server.plugins.JarScanner; import com.google.gerrit.server.schema.SchemaUpdater; @@ -455,7 +453,6 @@ bind(InitFlags.class).toInstance(init.flags); } }); - modules.add(new GitRepositoryManagerModule(new RepositoryConfig(init.flags.cfg))); Injector dbInjector = createDbInjector(SINGLE_USER); switch (IndexModule.getIndexType(dbInjector)) { case LUCENE:
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java new file mode 100644 index 0000000..2f94bdb --- /dev/null +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java
@@ -0,0 +1,66 @@ +// Copyright (C) 2017 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.pgm.init.api; + +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.config.SitePaths; +import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.SortedSet; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.RepositoryCache.FileKey; +import org.eclipse.jgit.util.FS; + +@Singleton +public class GitRepositoryManagerOnInit implements GitRepositoryManager { + private final InitFlags flags; + private final SitePaths site; + + @Inject + GitRepositoryManagerOnInit(InitFlags flags, SitePaths site) { + this.flags = flags; + this.site = site; + } + + @Override + public Repository openRepository(Project.NameKey name) + throws RepositoryNotFoundException, IOException { + return new FileRepository(getPath(name)); + } + + @Override + public Repository createRepository(Project.NameKey name) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + public SortedSet<Project.NameKey> list() { + throw new UnsupportedOperationException("not implemented"); + } + + private File getPath(Project.NameKey name) { + Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath")); + if (basePath == null) { + throw new IllegalStateException("gerrit.basePath must be configured"); + } + return FileKey.resolve(basePath.resolve(name.get()).toFile(), FS.DETECTED); + } +}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java index 769c7f5..bfad889 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java
@@ -29,7 +29,7 @@ private final AllUsersNameOnInitProvider allUsersName; @Inject - SequencesOnInit(GitRepositoryManager repoManager, AllUsersNameOnInitProvider allUsersName) { + SequencesOnInit(GitRepositoryManagerOnInit repoManager, AllUsersNameOnInitProvider allUsersName) { this.repoManager = repoManager; this.allUsersName = allUsersName; }