Fix default file name for code owner configs if file extension is configured
AbstractFileBasedCodeOwnerBackend#getFileName uses ProjectCache to
check whether the project exists since trying to get the code-owners
plugin configuration for a non-existing project throws an exception.
Bug: Google b/302720443
Change-Id: I65818e7dd875bf4a370e9ce49a87103d55eef0f5
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java b/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java
index 0be6cce..5dc8c9c 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java
@@ -31,6 +31,7 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.context.RefUpdateContext;
import java.io.IOException;
@@ -55,6 +56,7 @@
private final CodeOwnersPluginConfiguration codeOwnersPluginConfiguration;
private final GitRepositoryManager repoManager;
+ private final ProjectCache projectCache;
private final PersonIdent serverIdent;
private final MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory;
private final RetryHelper retryHelper;
@@ -65,6 +67,7 @@
protected AbstractFileBasedCodeOwnerBackend(
CodeOwnersPluginConfiguration codeOwnersPluginConfiguration,
GitRepositoryManager repoManager,
+ ProjectCache projectCache,
@GerritPersonIdent PersonIdent serverIdent,
MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
RetryHelper retryHelper,
@@ -73,6 +76,7 @@
CodeOwnerConfigParser codeOwnerConfigParser) {
this.codeOwnersPluginConfiguration = codeOwnersPluginConfiguration;
this.repoManager = repoManager;
+ this.projectCache = projectCache;
this.serverIdent = serverIdent;
this.metaDataUpdateInternalFactory = metaDataUpdateInternalFactory;
this.retryHelper = retryHelper;
@@ -132,7 +136,7 @@
@Override
public Path getFilePath(CodeOwnerConfig.Key codeOwnerConfigKey) {
- return codeOwnerConfigKey.filePath(defaultFileName);
+ return codeOwnerConfigKey.filePath(getFileName(codeOwnerConfigKey.project()));
}
@Override
@@ -191,9 +195,13 @@
private String getFileName(Project.NameKey project) {
return defaultFileName
- + codeOwnersPluginConfiguration
- .getProjectConfig(project)
- .getFileExtension()
+ + projectCache
+ .get(project)
+ .flatMap(
+ projectState ->
+ codeOwnersPluginConfiguration
+ .getProjectConfig(projectState.getNameKey())
+ .getFileExtension())
.map(ext -> "." + ext)
.orElse("");
}
@@ -254,11 +262,10 @@
codeOwnerConfigKey)
.setCodeOwnerConfigUpdate(codeOwnerConfigUpdate);
- try (
- RefUpdateContext pluginCtx = RefUpdateContext.open(PLUGIN);
+ try (RefUpdateContext pluginCtx = RefUpdateContext.open(PLUGIN);
RefUpdateContext ctx = RefUpdateContext.open(VERSIONED_META_DATA_CHANGE);
MetaDataUpdate metaDataUpdate =
- createMetaDataUpdate(codeOwnerConfigKey.project(), repository, currentUser)) {
+ createMetaDataUpdate(codeOwnerConfigKey.project(), repository, currentUser)) {
codeOwnerConfigFile.commit(metaDataUpdate);
}
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java b/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java
index 513bd12..941a31c 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java
@@ -23,6 +23,7 @@
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.update.RetryHelper;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -47,12 +48,14 @@
CodeOwnerConfigFile.Factory codeOwnerConfigFileFactory,
FindOwnersCodeOwnerConfigParser codeOwnerConfigParser,
GitRepositoryManager repoManager,
+ ProjectCache projectCache,
@GerritPersonIdent PersonIdent serverIdent,
MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
RetryHelper retryHelper) {
super(
codeOwnersPluginConfiguration,
repoManager,
+ projectCache,
serverIdent,
metaDataUpdateInternalFactory,
retryHelper,
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java b/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java
index ccb59df..a761bf6 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java
@@ -23,6 +23,7 @@
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.update.RetryHelper;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -49,6 +50,7 @@
ProtoBackend(
CodeOwnersPluginConfiguration codeOwnersPluginConfiguration,
GitRepositoryManager repoManager,
+ ProjectCache projectCache,
@GerritPersonIdent PersonIdent serverIdent,
MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
RetryHelper retryHelper,
@@ -57,6 +59,7 @@
super(
codeOwnersPluginConfiguration,
repoManager,
+ projectCache,
serverIdent,
metaDataUpdateInternalFactory,
retryHelper,
diff --git a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java
index 1ca5fd9..69bcd30 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java
@@ -1925,4 +1925,32 @@
unresolvableCodeOwnerConfigReference.importMode(),
String.format("project %s not found", nonExistingProject));
}
+
+ @Test
+ @GerritConfig(name = "plugin.code-owners.fileExtension", value = "foo")
+ public void returnedOwnersFileContainsFileExtension() throws Exception {
+ CodeOwnerConfig.Key codeOwnerConfigKey =
+ codeOwnerConfigOperations
+ .newCodeOwnerConfig()
+ .project(project)
+ .branch("master")
+ .folderPath("/")
+ .fileName(getCodeOwnerConfigFileName() + ".foo")
+ .addCodeOwnerEmail(admin.email())
+ .create();
+
+ CodeOwnersInfo codeOwnersInfo = queryCodeOwners("foo/bar/baz.md");
+ assertThat(codeOwnersInfo)
+ .hasCodeOwnersThat()
+ .comparingElementsUsing(hasAccountId())
+ .containsExactly(admin.id());
+
+ assertThat(codeOwnersInfo.codeOwnerConfigs).hasSize(1);
+ CodeOwnerConfigFileInfo codeOwnerConfigFileInfo = codeOwnersInfo.codeOwnerConfigs.get(0);
+ assertThat(codeOwnerConfigFileInfo)
+ .assertKey(backend, codeOwnerConfigKey)
+ .assertNoImports()
+ .assertNoImportMode()
+ .assertNoUnresolvedErrorMessage();
+ }
}