Return web links for OWNERS files when listing code owners When listing code owners the response contains the code owner config files (e.g. OWNERS files) that have been inspected to gather the code owners. Knowing the inspected code owner config files is important if you want to verify that the correct code owners have been returned or if you want to understand why a certain expected code owner was not included, as in this case you want to look into these code owner config files to see which code owners and rules they define. So far, we returned the project, branch and path for the code owner config files, which is sufficient to locate the code owner config files, but assembling the links to the code owner config files from this information is cumbersome and can take significant time, especially if you need to inspect multiple code owner config files. To save this effort we now return file web links for the code owner config files. Having file web links available makes the lookup of code owner config files much easier, as they contain the direct URLs to the code owner config files. Note that file web links are only available if they are configured. CodeOwnerConfigFileJson is the class that writes the JSON for the returned code owner config files. In this class we need to set the new CodeOwnerConfigFileInfo.webLinks field. To create the file web links we need the project, branch and path of the code owner config file, but also the revision from which it was read. The revision was not available in CodeOwnerConfigFileJson since it only got the CodeOwnerConfig.Key as input which doesn't contain the revision. To make the revision available we have to provide CodeOwnerConfig instead of CodeOwnerConfig.Key. CodeOwnerConfigFileJson also gets imported code owner config files as input which are formatted in the same way as the importing code owner config file. To include web links for them too CodeOwnerConfigImport needs to be extended to contain CodeOwnerConfig, which contains the revision, instead of only CodeOwnerConfig.Key. Since some imports can be unresolved (e.g. an import that references an non-existing code owner config file) the imported CodeOwnerConfig in CodeOwnerConfigImport is optional (i.e. it is not set for unresolved imports). This means, if an import is unresolved no web links are returned for it. Due to CodeOwnerConfigImport needing the imported CodeOwnerConfig for resolved imports now, we need to provide it in PathCodeOwners which is responsible for resolving the imports and also in quite some tests. Bug: Google b/345161989 Change-Id: If7efad1ffaf456a192ccea2e09d76b19d8f3b4fa Signed-off-by: Edwin Kempin <ekempin@google.com> Reviewed-on: https://gerrit-review.googlesource.com/c/plugins/code-owners/+/434337 Reviewed-by: Kamil Musin <kamilm@google.com> Tested-by: Zuul <zuul-63@gerritcodereview-ci.iam.gserviceaccount.com>
diff --git a/java/com/google/gerrit/plugins/codeowners/api/CodeOwnerConfigFileInfo.java b/java/com/google/gerrit/plugins/codeowners/api/CodeOwnerConfigFileInfo.java index 41fa62b..4e9863b 100644 --- a/java/com/google/gerrit/plugins/codeowners/api/CodeOwnerConfigFileInfo.java +++ b/java/com/google/gerrit/plugins/codeowners/api/CodeOwnerConfigFileInfo.java
@@ -14,6 +14,7 @@ package com.google.gerrit.plugins.codeowners.api; +import com.google.gerrit.extensions.common.WebLinkInfo; import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImportMode; import java.util.List; @@ -43,6 +44,9 @@ /** The path of the code owner config file. */ public String path; + /** Links to the code owner config file in external sites. */ + public List<WebLinkInfo> webLinks; + /** Imported code owner config files. */ public List<CodeOwnerConfigFileInfo> imports;
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImport.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImport.java index a75c15b..fc1b521 100644 --- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImport.java +++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImport.java
@@ -22,22 +22,30 @@ /** * Information about an import of a {@link CodeOwnerConfig}. * - * <p>Contains the keys of the importing and the imported code owner config, as well as the - * reference that the importing code owner config uses to reference the imported code owner config - * (contains the import mode). + * <p>Contains the importing code owner config, the key of the imported code owner config, the + * imported code owner config if the import could be resolved, as well as the reference that the + * importing code owner config uses to reference the imported code owner config (contains the import + * mode). * * <p>It's possible that this class represents non-resolveable imports (e.g. an import of a - * non-existing code owner config). In this case an error message is contained that explains why the - * import couldn't be resolved. + * non-existing code owner config). In this case the imported code owner config is not available and + * an error message is contained that explains why the import couldn't be resolved. */ @AutoValue public abstract class CodeOwnerConfigImport { /** Key of the importing code owner config. */ - public abstract CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig(); + public abstract CodeOwnerConfig importingCodeOwnerConfig(); /** Key of the imported code owner config. */ public abstract CodeOwnerConfig.Key keyOfImportedCodeOwnerConfig(); + /** + * Imported code owner config. + * + * <p>Not set for unresolved imports. + */ + public abstract Optional<CodeOwnerConfig> importedCodeOwnerConfig(); + /** The code owner config reference that references the imported code owner config. */ public abstract CodeOwnerConfigReference codeOwnerConfigReference(); @@ -50,8 +58,9 @@ @Override public final String toString() { return MoreObjects.toStringHelper(this) - .add("keyOfImportingCodeOwnerConfig", keyOfImportingCodeOwnerConfig()) + .add("importingCodeOwnerConfig", importingCodeOwnerConfig()) .add("keyOfImportedCodeOwnerConfig", keyOfImportedCodeOwnerConfig()) + .add("importedCodeOwnerConfig", importedCodeOwnerConfig()) .add("codeOwnerConfigReference", codeOwnerConfigReference()) .add("errorMessage", errorMessage()) .toString(); @@ -60,13 +69,14 @@ /** Creates a {@link CodeOwnerConfigImport} instance for an unresolved import. */ @VisibleForTesting public static CodeOwnerConfigImport createUnresolvedImport( - CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig, + CodeOwnerConfig importingCodeOwnerConfig, CodeOwnerConfig.Key keyOfImportedCodeOwnerConfig, CodeOwnerConfigReference codeOwnerConfigReference, String errorMessage) { return new AutoValue_CodeOwnerConfigImport( - keyOfImportingCodeOwnerConfig, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, + Optional.empty(), codeOwnerConfigReference, Optional.of(errorMessage)); } @@ -74,12 +84,13 @@ /** Creates a {@link CodeOwnerConfigImport} instance for a resolved import. */ @VisibleForTesting public static CodeOwnerConfigImport createResolvedImport( - CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig, - CodeOwnerConfig.Key keyOfImportedCodeOwnerConfig, + CodeOwnerConfig importingCodeOwnerConfig, + CodeOwnerConfig importedCodeOwnerConfig, CodeOwnerConfigReference codeOwnerConfigReference) { return new AutoValue_CodeOwnerConfigImport( - keyOfImportingCodeOwnerConfig, - keyOfImportedCodeOwnerConfig, + importingCodeOwnerConfig, + importedCodeOwnerConfig.key(), + Optional.of(importedCodeOwnerConfig), codeOwnerConfigReference, Optional.empty()); }
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/PathCodeOwners.java b/java/com/google/gerrit/plugins/codeowners/backend/PathCodeOwners.java index 5e7a11f..ac4f4eb 100644 --- a/java/com/google/gerrit/plugins/codeowners/backend/PathCodeOwners.java +++ b/java/com/google/gerrit/plugins/codeowners/backend/PathCodeOwners.java
@@ -320,8 +320,7 @@ // Resolve per-file imports. ImmutableSet<CodeOwnerImport> perFileImports = - getPerFileImports( - 0, codeOwnerConfig.key(), resolvedCodeOwnerConfigBuilder.codeOwnerSets()); + getPerFileImports(0, codeOwnerConfig, resolvedCodeOwnerConfigBuilder.codeOwnerSets()); OptionalResultWithMessages<CodeOwnerConfigImports> perFileImportedCodeOwnerConfigs = resolveImports(codeOwnerConfig.key(), perFileImports, resolvedCodeOwnerConfigBuilder); messages.addAll(perFileImportedCodeOwnerConfigs.messages()); @@ -384,7 +383,7 @@ codeOwnerConfigImport.referenceToImportedCodeOwnerConfig(); CodeOwnerConfig.Key keyOfImportedCodeOwnerConfig = createKeyForImportedCodeOwnerConfig( - codeOwnerConfigImport.importingCodeOwnerConfig(), codeOwnerConfigReference); + codeOwnerConfigImport.importingCodeOwnerConfig().key(), codeOwnerConfigReference); try (Timer0.Context ctx2 = codeOwnerMetrics.resolveCodeOwnerConfigImport.start()) { logger.atFine().log( @@ -450,7 +449,7 @@ resolvedImports.add( CodeOwnerConfigImport.createResolvedImport( codeOwnerConfigImport.importingCodeOwnerConfig(), - keyOfImportedCodeOwnerConfig, + importedCodeOwnerConfig, codeOwnerConfigReference)); CodeOwnerConfigImportMode importMode = codeOwnerConfigReference.importMode(); @@ -495,7 +494,7 @@ transitiveImports.addAll( getPerFileImports( codeOwnerConfigImport.importLevel() + 1, - importedCodeOwnerConfig.key(), + importedCodeOwnerConfig, matchingPerFileCodeOwnerSets)); if (importMode == CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY) { @@ -539,15 +538,12 @@ return codeOwnerConfig.imports().stream() .map( codeOwnerConfigReference -> - CodeOwnerImport.create( - importLevel, codeOwnerConfig.key(), codeOwnerConfigReference)) + CodeOwnerImport.create(importLevel, codeOwnerConfig, codeOwnerConfigReference)) .collect(toImmutableSet()); } private ImmutableSet<CodeOwnerImport> getPerFileImports( - int importLevel, - CodeOwnerConfig.Key importingCodeOwnerConfig, - Set<CodeOwnerSet> codeOwnerSets) { + int importLevel, CodeOwnerConfig importingCodeOwnerConfig, Set<CodeOwnerSet> codeOwnerSets) { ImmutableSet.Builder<CodeOwnerImport> codeOwnerConfigImports = ImmutableSet.builder(); for (CodeOwnerSet codeOwnerSet : codeOwnerSets) { codeOwnerSet.imports().stream() @@ -646,8 +642,8 @@ */ public abstract int importLevel(); - /** The key of the code owner config that contains the import. */ - public abstract CodeOwnerConfig.Key importingCodeOwnerConfig(); + /** The code owner config that contains the import. */ + public abstract CodeOwnerConfig importingCodeOwnerConfig(); /** The reference to the imported code owner config */ public abstract CodeOwnerConfigReference referenceToImportedCodeOwnerConfig(); @@ -699,7 +695,7 @@ public static CodeOwnerImport create( int importLevel, - CodeOwnerConfig.Key importingCodeOwnerConfig, + CodeOwnerConfig importingCodeOwnerConfig, CodeOwnerConfigReference codeOwnerConfigReference) { return create( importLevel, importingCodeOwnerConfig, codeOwnerConfigReference, Optional.empty()); @@ -707,7 +703,7 @@ public static CodeOwnerImport create( int importLevel, - CodeOwnerConfig.Key importingCodeOwnerConfig, + CodeOwnerConfig importingCodeOwnerConfig, CodeOwnerConfigReference codeOwnerConfigReference, CodeOwnerSet codeOwnerSet) { return create( @@ -719,7 +715,7 @@ public static CodeOwnerImport create( int importLevel, - CodeOwnerConfig.Key importingCodeOwnerConfig, + CodeOwnerConfig importingCodeOwnerConfig, CodeOwnerConfigReference codeOwnerConfigReference, Optional<CodeOwnerSet> codeOwnerSet) { return new AutoValue_PathCodeOwners_CodeOwnerImport(
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/UnresolvedImportFormatter.java b/java/com/google/gerrit/plugins/codeowners/backend/UnresolvedImportFormatter.java index 7946468..9f96afc 100644 --- a/java/com/google/gerrit/plugins/codeowners/backend/UnresolvedImportFormatter.java +++ b/java/com/google/gerrit/plugins/codeowners/backend/UnresolvedImportFormatter.java
@@ -43,9 +43,9 @@ unresolvedImport.keyOfImportedCodeOwnerConfig().project(), unresolvedImport.keyOfImportedCodeOwnerConfig().shortBranchName(), getFilePath(unresolvedImport.keyOfImportedCodeOwnerConfig()), - unresolvedImport.keyOfImportingCodeOwnerConfig().project(), - unresolvedImport.keyOfImportingCodeOwnerConfig().shortBranchName(), - getFilePath(unresolvedImport.keyOfImportingCodeOwnerConfig()), + unresolvedImport.importingCodeOwnerConfig().key().project(), + unresolvedImport.importingCodeOwnerConfig().key().shortBranchName(), + getFilePath(unresolvedImport.importingCodeOwnerConfig().key()), unresolvedImport .errorMessage() .orElseThrow(
diff --git a/java/com/google/gerrit/plugins/codeowners/restapi/AbstractGetCodeOwnersForPath.java b/java/com/google/gerrit/plugins/codeowners/restapi/AbstractGetCodeOwnersForPath.java index 0fbb01d..1ddaa9b 100644 --- a/java/com/google/gerrit/plugins/codeowners/restapi/AbstractGetCodeOwnersForPath.java +++ b/java/com/google/gerrit/plugins/codeowners/restapi/AbstractGetCodeOwnersForPath.java
@@ -229,7 +229,7 @@ codeOwnerConfigFileInfosBuilder.add( codeOwnerConfigFileJson.format( - codeOwnerConfig.key(), + codeOwnerConfig, pathCodeOwners.resolvedImports(), pathCodeOwners.unresolvedImports()));
diff --git a/java/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJson.java b/java/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJson.java index fe17a3f..ed59a8e 100644 --- a/java/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJson.java +++ b/java/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJson.java
@@ -14,31 +14,35 @@ package com.google.gerrit.plugins.codeowners.restapi; +import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableList; +import com.google.gerrit.extensions.common.WebLinkInfo; import com.google.gerrit.plugins.codeowners.api.CodeOwnerConfigFileInfo; import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfig; import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImport; import com.google.gerrit.plugins.codeowners.backend.UnresolvedImportFormatter; +import com.google.gerrit.server.WebLinks; import com.google.inject.Inject; import java.util.List; /** Collection of routines to populate {@link CodeOwnerConfigFileInfo}. */ public class CodeOwnerConfigFileJson { + private final WebLinks webLinks; private final UnresolvedImportFormatter unresolvedImportFormatter; @Inject - CodeOwnerConfigFileJson(UnresolvedImportFormatter unresolvedImportFormatter) { + CodeOwnerConfigFileJson(WebLinks webLinks, UnresolvedImportFormatter unresolvedImportFormatter) { + this.webLinks = webLinks; this.unresolvedImportFormatter = unresolvedImportFormatter; } /** * Formats the provided code owner config file information as a {@link CodeOwnerConfigFileInfo}. * - * @param codeOwnerConfigKey the key of the code owner config file as {@link - * CodeOwnerConfigFileInfo} + * @param codeOwnerConfig the code owner config * @param resolvedImports code owner config files which have been successfully imported directly * or indirectly * @param unresolvedImports code owner config files which are imported directly or indirectly but @@ -47,6 +51,25 @@ * as {@link CodeOwnerConfigFileInfo} */ public CodeOwnerConfigFileInfo format( + CodeOwnerConfig codeOwnerConfig, + List<CodeOwnerConfigImport> resolvedImports, + List<CodeOwnerConfigImport> unresolvedImports) { + requireNonNull(codeOwnerConfig, "codeOwnerConfig"); + requireNonNull(resolvedImports, "resolvedImports"); + requireNonNull(unresolvedImports, "unresolvedImports"); + + CodeOwnerConfigFileInfo info = + format(codeOwnerConfig.key(), resolvedImports, unresolvedImports); + + ImmutableList<WebLinkInfo> fileLinks = + webLinks.getFileLinks( + info.project, info.branch, codeOwnerConfig.revision().getName(), info.path); + info.webLinks = !fileLinks.isEmpty() ? fileLinks : null; + + return info; + } + + private CodeOwnerConfigFileInfo format( CodeOwnerConfig.Key codeOwnerConfigKey, List<CodeOwnerConfigImport> resolvedImports, List<CodeOwnerConfigImport> unresolvedImports) { @@ -64,7 +87,7 @@ unresolvedImports.stream() .filter( unresolvedImport -> - unresolvedImport.keyOfImportingCodeOwnerConfig().equals(codeOwnerConfigKey)) + unresolvedImport.importingCodeOwnerConfig().key().equals(codeOwnerConfigKey)) .map( unresolvedImport -> { CodeOwnerConfigFileInfo unresolvedCodeOwnerConfigFileInfo = @@ -92,12 +115,15 @@ resolvedImports.stream() .filter( resolvedImport -> - resolvedImport.keyOfImportingCodeOwnerConfig().equals(codeOwnerConfigKey)) + resolvedImport.importingCodeOwnerConfig().key().equals(codeOwnerConfigKey)) .map( resolvedImport -> { + checkState( + resolvedImport.importedCodeOwnerConfig().isPresent(), + "no imported code owner config for resolved import"); CodeOwnerConfigFileInfo resolvedCodeOwnerConfigFileInfo = format( - resolvedImport.keyOfImportedCodeOwnerConfig(), + resolvedImport.importedCodeOwnerConfig().get(), removeImportEntriesFor(resolvedImports, codeOwnerConfigKey), removeImportEntriesFor(unresolvedImports, codeOwnerConfigKey)); resolvedCodeOwnerConfigFileInfo.importMode = @@ -113,7 +139,7 @@ private ImmutableList<CodeOwnerConfigImport> removeImportEntriesFor( List<CodeOwnerConfigImport> imports, CodeOwnerConfig.Key codeOwnerConfigKey) { return imports.stream() - .filter(i -> !i.keyOfImportingCodeOwnerConfig().equals(codeOwnerConfigKey)) + .filter(i -> !i.importingCodeOwnerConfig().key().equals(codeOwnerConfigKey)) .collect(toImmutableList()); } }
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImportTest.java b/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImportTest.java index b6efbc6..85e7eb5 100644 --- a/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImportTest.java +++ b/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigImportTest.java
@@ -14,16 +14,24 @@ package com.google.gerrit.plugins.codeowners.backend; +import org.eclipse.jgit.lib.ObjectId; import org.junit.Test; /** Tests for {@link CodeOwnerConfigImport}. */ public class CodeOwnerConfigImportTest extends AbstractAutoValueTest { + private static final ObjectId TEST_REVISION = + ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); + @Test public void toStringIncludesAllData_resolvedImport() throws Exception { CodeOwnerConfigImport resolvedImport = CodeOwnerConfigImport.createResolvedImport( - CodeOwnerConfig.Key.create(project, "master", "/"), - CodeOwnerConfig.Key.create(project, "master", "/bar/"), + CodeOwnerConfig.builder( + CodeOwnerConfig.Key.create(project, "master", "/"), TEST_REVISION) + .build(), + CodeOwnerConfig.builder( + CodeOwnerConfig.Key.create(project, "master", "/bar/"), TEST_REVISION) + .build(), CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/bar/OWNERS")); assertThatToStringIncludesAllData(resolvedImport, CodeOwnerConfigImport.class); } @@ -32,7 +40,9 @@ public void toStringIncludesAllData_unresolvedImport() throws Exception { CodeOwnerConfigImport unresolvedImport = CodeOwnerConfigImport.createUnresolvedImport( - CodeOwnerConfig.Key.create(project, "master", "/"), + CodeOwnerConfig.builder( + CodeOwnerConfig.Key.create(project, "master", "/"), TEST_REVISION) + .build(), CodeOwnerConfig.Key.create(project, "master", "/bar/"), CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/bar/OWNERS"), "test message");
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolverResultTest.java b/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolverResultTest.java index deab817..febdf6b 100644 --- a/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolverResultTest.java +++ b/javatests/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolverResultTest.java
@@ -17,10 +17,14 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; +import org.eclipse.jgit.lib.ObjectId; import org.junit.Test; /** Tests for {@link CodeOwnerResolverResult}. */ public class CodeOwnerResolverResultTest extends AbstractAutoValueTest { + private static final ObjectId TEST_REVISION = + ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); + @Test public void toStringIncludesAllData() throws Exception { CodeOwnerResolverResult codeOwnerResolverResult = @@ -31,12 +35,18 @@ /* hasUnresolvedCodeOwners= */ false, ImmutableList.of( CodeOwnerConfigImport.createResolvedImport( - CodeOwnerConfig.Key.create(project, "master", "/"), - CodeOwnerConfig.Key.create(project, "master", "/bar/"), + CodeOwnerConfig.builder( + CodeOwnerConfig.Key.create(project, "master", "/"), TEST_REVISION) + .build(), + CodeOwnerConfig.builder( + CodeOwnerConfig.Key.create(project, "master", "/bar/"), TEST_REVISION) + .build(), CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/bar/OWNERS"))), ImmutableList.of( CodeOwnerConfigImport.createUnresolvedImport( - CodeOwnerConfig.Key.create(project, "master", "/"), + CodeOwnerConfig.builder( + CodeOwnerConfig.Key.create(project, "master", "/"), TEST_REVISION) + .build(), CodeOwnerConfig.Key.create(project, "master", "/bar/"), CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/bar/OWNERS"), "test message")),
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersResultTest.java b/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersResultTest.java index a33835d..2970d71 100644 --- a/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersResultTest.java +++ b/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersResultTest.java
@@ -27,6 +27,8 @@ @Test public void toStringIncludesAllData() throws Exception { CodeOwnerConfig.Key codeOwnerConfigKey = CodeOwnerConfig.Key.create(project, "master", "/"); + CodeOwnerConfig codeOwnerConfig = + CodeOwnerConfig.builder(codeOwnerConfigKey, TEST_REVISION).build(); CodeOwnerConfigReference resolvableCodeOwnerConfigReference = CodeOwnerConfigReference.create(CodeOwnerConfigImportMode.ALL, "/bar/OWNERS"); CodeOwnerConfigReference unresolvableCodeOwnerConfigReference = @@ -40,12 +42,14 @@ .build(), ImmutableList.of( CodeOwnerConfigImport.createResolvedImport( - codeOwnerConfigKey, - CodeOwnerConfig.Key.create(project, "master", "/bar/"), + codeOwnerConfig, + CodeOwnerConfig.builder( + CodeOwnerConfig.Key.create(project, "master", "/bar/"), TEST_REVISION) + .build(), resolvableCodeOwnerConfigReference)), ImmutableList.of( CodeOwnerConfigImport.createUnresolvedImport( - codeOwnerConfigKey, + codeOwnerConfig, CodeOwnerConfig.Key.create(project, "master", "/baz/"), unresolvableCodeOwnerConfigReference, "test message")));
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersTest.java b/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersTest.java index 73d1e3d..8c67161 100644 --- a/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersTest.java +++ b/javatests/com/google/gerrit/plugins/codeowners/backend/PathCodeOwnersTest.java
@@ -474,7 +474,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with non-resolveable import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -484,10 +484,13 @@ .addCodeOwnerSet(CodeOwnerSet.builder().addCodeOwnerEmail(admin.email()).build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -502,7 +505,7 @@ assertThat(pathCodeOwnersResult.unresolvedImports()) .containsExactly( CodeOwnerConfigImport.createUnresolvedImport( - importingCodeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, String.format( @@ -530,7 +533,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create config with import of non code owner config file - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -540,10 +543,13 @@ .addCodeOwnerSet(CodeOwnerSet.builder().addCodeOwnerEmail(admin.email()).build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -558,7 +564,7 @@ assertThat(pathCodeOwnersResult.unresolvedImports()) .containsExactly( CodeOwnerConfigImport.createUnresolvedImport( - importingCodeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, String.format( @@ -589,7 +595,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create the importing config - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -599,10 +605,13 @@ .addCodeOwnerSet(CodeOwnerSet.builder().addCodeOwnerEmail(admin.email()).build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -618,7 +627,7 @@ assertThat(pathCodeOwnersResult.unresolvedImports()) .containsExactly( CodeOwnerConfigImport.createUnresolvedImport( - importingCodeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, String.format( @@ -650,7 +659,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create the importing config - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -660,10 +669,15 @@ .addCodeOwnerSet(CodeOwnerSet.builder().addCodeOwnerEmail(admin.email()).build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -677,9 +691,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -708,7 +720,7 @@ createCodeOwnerConfigReference(importMode, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -718,10 +730,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -735,9 +752,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -761,7 +776,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with matching per-file code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -775,10 +790,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -792,9 +812,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -818,7 +836,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with matching per-file code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -832,10 +850,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -850,9 +873,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -877,7 +898,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); // create importing config with matching per-file code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -891,10 +912,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -909,9 +935,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -939,7 +963,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -949,10 +973,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -970,9 +999,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1000,7 +1027,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1010,10 +1037,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1030,9 +1062,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1060,7 +1090,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1070,10 +1100,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1090,9 +1125,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1112,7 +1145,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1122,10 +1155,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1137,9 +1175,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1161,7 +1197,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); // create importing config - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1171,10 +1207,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1186,9 +1227,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1236,7 +1275,7 @@ createCodeOwnerConfigReference(importMode, keyOfImportedCodeOwnerConfig1); // create importing config with global code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1246,10 +1285,17 @@ .addImport(codeOwnerConfigReference1) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig1).get(); + CodeOwnerConfig importedCodeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig2).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1263,13 +1309,9 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig2, - codeOwnerConfigReference2)); + importedCodeOwnerConfig1, importedCodeOwnerConfig2, codeOwnerConfigReference2)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1313,7 +1355,7 @@ // create importing config with global code owner and import with import mode // GLOBAL_CODE_OWNER_SETS_ONLY - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1323,10 +1365,17 @@ .addImport(codeOwnerConfigReference1) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig1).get(); + CodeOwnerConfig importedCodeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig2).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1341,12 +1390,10 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig2, + importedCodeOwnerConfig1, + importedCodeOwnerConfig2, createCodeOwnerConfigReference( CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig2))); @@ -1390,7 +1437,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1400,10 +1447,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1417,9 +1469,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1443,7 +1493,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1454,10 +1504,15 @@ .addImport(codeOwnerConfigReference1) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1470,13 +1525,9 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig, - importingCodeOwnerConfigKey, - codeOwnerConfigReference2)); + importedCodeOwnerConfig, importingCodeOwnerConfig, codeOwnerConfigReference2)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1547,7 +1598,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import with relative path - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1557,10 +1608,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo/bar/baz.md")); assertThat(pathCodeOwners).isPresent(); @@ -1573,9 +1629,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1587,7 +1641,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import from non-existing project - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1597,10 +1651,13 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo/bar/baz.md")); assertThat(pathCodeOwners).isPresent(); @@ -1614,7 +1671,7 @@ assertThat(pathCodeOwnersResult.unresolvedImports()) .containsExactly( CodeOwnerConfigImport.createUnresolvedImport( - importingCodeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, String.format("project %s not found", keyOfImportedCodeOwnerConfig.project()))); @@ -1640,7 +1697,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import from the hidden project - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1650,10 +1707,13 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo/bar/baz.md")); assertThat(pathCodeOwners).isPresent(); @@ -1669,7 +1729,7 @@ assertThat(pathCodeOwnersResult.unresolvedImports()) .containsExactly( CodeOwnerConfigImport.createUnresolvedImport( - importingCodeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, String.format( @@ -1685,7 +1745,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import from non-existing branch - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1695,10 +1755,13 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo/bar/baz.md")); assertThat(pathCodeOwners).isPresent(); @@ -1712,7 +1775,7 @@ assertThat(pathCodeOwnersResult.unresolvedImports()) .containsExactly( CodeOwnerConfigImport.createUnresolvedImport( - importingCodeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, "code owner config does not exist (revision = current)")); @@ -1736,7 +1799,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import with relative path - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1746,10 +1809,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo/bar/baz.md")); assertThat(pathCodeOwners).isPresent(); @@ -1762,9 +1830,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1795,7 +1861,7 @@ .build(); // create importing config with global code owner and import with relative path - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1805,10 +1871,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead(branchName), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1821,9 +1892,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1847,7 +1916,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import with relative path - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1857,10 +1926,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo/bar/baz.md")); assertThat(pathCodeOwners).isPresent(); @@ -1873,9 +1947,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1901,7 +1973,7 @@ createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, keyOfImportedCodeOwnerConfig); // create importing config with global code owner and import with relative path - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1911,10 +1983,15 @@ .addImport(codeOwnerConfigReference) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo/bar/baz.md")); assertThat(pathCodeOwners).isPresent(); @@ -1927,9 +2004,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -1942,7 +2017,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); // create importing config with non-resolveable per file import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -1956,10 +2031,13 @@ .build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -1974,7 +2052,7 @@ assertThat(pathCodeOwnersResult.unresolvedImports()) .containsExactly( CodeOwnerConfigImport.createUnresolvedImport( - importingCodeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, String.format( @@ -2011,7 +2089,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); // create importing config with per code owner and per file import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2025,10 +2103,15 @@ .build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2047,9 +2130,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -2087,7 +2168,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig1); // create importing config with per file code owner and per file import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2101,10 +2182,17 @@ .build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig1).get(); + CodeOwnerConfig importedCodeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig2).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2118,13 +2206,9 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig2, - codeOwnerConfigReference2)); + importedCodeOwnerConfig1, importedCodeOwnerConfig2, codeOwnerConfigReference2)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -2165,7 +2249,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig1); // create importing config with per file code owner and per file import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2179,10 +2263,17 @@ .build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig1).get(); + CodeOwnerConfig importedCodeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig2).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2197,12 +2288,10 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig2, + importedCodeOwnerConfig1, + importedCodeOwnerConfig2, createCodeOwnerConfigReference( CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig2))); @@ -2265,7 +2354,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig1); // create importing config with global import - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2274,12 +2363,21 @@ .addImport(codeOwnerConfigReference1) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig1).get(); + CodeOwnerConfig importedCodeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig2).get(); + CodeOwnerConfig importedCodeOwnerConfig3 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig3).get(); + // Expectation for foo.xyz file: code owners is empty since foo.xyz neither matches *.md nor // *.txt Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.xyz")); assertThat(pathCodeOwners).isPresent(); @@ -2288,16 +2386,14 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1)); + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); // Expectation for foo.md file: code owners contains only user since foo.md only matches *.md pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2308,13 +2404,9 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig2, - codeOwnerConfigReference2)); + importedCodeOwnerConfig1, importedCodeOwnerConfig2, codeOwnerConfigReference2)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); // Expectation for foo.txt file: code owners contains only user2 since foo.txt only matches @@ -2322,7 +2414,7 @@ pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.txt")); assertThat(pathCodeOwners).isPresent(); @@ -2333,13 +2425,9 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig3, - codeOwnerConfigReference3)); + importedCodeOwnerConfig1, importedCodeOwnerConfig3, codeOwnerConfigReference3)); } @Test @@ -2481,7 +2569,7 @@ // * has a global code owner // * has a per-file import for md files // * ignores global and parent code owners for md files - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2496,10 +2584,15 @@ .build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2514,9 +2607,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -2548,7 +2639,7 @@ // create importing config that has a global import with mode ALL and a per-file rule for md // files that ignores global and parent code owners - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2564,10 +2655,15 @@ .build()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2583,9 +2679,7 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig, - codeOwnerConfigReference)); + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -2625,7 +2719,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig1); // create importing config - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2635,10 +2729,17 @@ .addImport(codeOwnerConfigReference1) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig1).get(); + CodeOwnerConfig importedCodeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig2).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2652,13 +2753,9 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig2, - codeOwnerConfigReference2)); + importedCodeOwnerConfig1, importedCodeOwnerConfig2, codeOwnerConfigReference2)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); } @@ -2698,7 +2795,7 @@ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig1); // create importing config - CodeOwnerConfig.Key importingCodeOwnerConfigKey = + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -2708,10 +2805,17 @@ .addImport(codeOwnerConfigReference1) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + CodeOwnerConfig importedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig1).get(); + CodeOwnerConfig importedCodeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig2).get(); + Optional<PathCodeOwners> pathCodeOwners = pathCodeOwnersFactory.create( transientCodeOwnerConfigCacheProvider.get(), - importingCodeOwnerConfigKey, + keyOfImportingCodeOwnerConfig, projectOperations.project(project).getHead("master"), Path.of("/foo.md")); assertThat(pathCodeOwners).isPresent(); @@ -2725,13 +2829,9 @@ assertThat(pathCodeOwnersResult.resolvedImports()) .containsExactly( CodeOwnerConfigImport.createResolvedImport( - importingCodeOwnerConfigKey, - keyOfImportedCodeOwnerConfig1, - codeOwnerConfigReference1), + importingCodeOwnerConfig, importedCodeOwnerConfig1, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig1, - keyOfImportedCodeOwnerConfig2, - codeOwnerConfigReference2)); + importedCodeOwnerConfig1, importedCodeOwnerConfig2, codeOwnerConfigReference2)); assertThat(pathCodeOwnersResult.unresolvedImports()).isEmpty(); }
diff --git a/javatests/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJsonIT.java b/javatests/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJsonIT.java index ed0b301..fa1d9c8 100644 --- a/javatests/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJsonIT.java +++ b/javatests/com/google/gerrit/plugins/codeowners/restapi/CodeOwnerConfigFileJsonIT.java
@@ -19,18 +19,25 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import com.google.gerrit.entities.Project; +import com.google.gerrit.acceptance.ExtensionRegistry; +import com.google.gerrit.acceptance.ExtensionRegistry.Registration; +import com.google.gerrit.entities.BranchNameKey; +import com.google.gerrit.extensions.common.WebLinkInfo; +import com.google.gerrit.extensions.webui.FileWebLink; import com.google.gerrit.plugins.codeowners.acceptance.AbstractCodeOwnersIT; import com.google.gerrit.plugins.codeowners.api.CodeOwnerConfigFileInfo; import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfig; import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImport; import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigImportMode; import com.google.gerrit.plugins.codeowners.backend.CodeOwnerConfigReference; +import com.google.inject.Inject; import org.junit.Before; import org.junit.Test; /** Tests for {@link CodeOwnerConfigFileJson}. */ public class CodeOwnerConfigFileJsonIT extends AbstractCodeOwnersIT { + @Inject private ExtensionRegistry extensionRegistry; + private CodeOwnerConfigFileJson CodeOwnerConfigFileJson; @Before @@ -39,28 +46,35 @@ } @Test - public void cannotFormatWithNullCodeOwnerConfigKey() throws Exception { + public void cannotFormatWithNullCodeOwnerConfig() throws Exception { NullPointerException npe = assertThrows( NullPointerException.class, () -> CodeOwnerConfigFileJson.format( - /* codeOwnerConfigKey= */ null, + /* codeOwnerConfig= */ null, /* resolvedImports= */ ImmutableList.of(), /* unresolvedImports= */ ImmutableList.of())); - assertThat(npe).hasMessageThat().isEqualTo("codeOwnerConfigKey"); + assertThat(npe).hasMessageThat().isEqualTo("codeOwnerConfig"); } @Test public void cannotFormatWithNullResolvedImports() throws Exception { CodeOwnerConfig.Key codeOwnerConfigKey = - CodeOwnerConfig.Key.create(Project.nameKey("project"), "master", "/"); + codeOwnerConfigOperations + .newCodeOwnerConfig() + .project(project) + .branch("master") + .addCodeOwnerEmail(admin.email()) + .create(); + CodeOwnerConfig codeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey).get(); NullPointerException npe = assertThrows( NullPointerException.class, () -> CodeOwnerConfigFileJson.format( - codeOwnerConfigKey, + codeOwnerConfig, /* resolvedImports= */ null, /* unresolvedImports= */ ImmutableList.of())); assertThat(npe).hasMessageThat().isEqualTo("resolvedImports"); @@ -69,13 +83,20 @@ @Test public void cannotFormatWithNullUnresolvedImports() throws Exception { CodeOwnerConfig.Key codeOwnerConfigKey = - CodeOwnerConfig.Key.create(Project.nameKey("project"), "master", "/"); + codeOwnerConfigOperations + .newCodeOwnerConfig() + .project(project) + .branch("master") + .addCodeOwnerEmail(admin.email()) + .create(); + CodeOwnerConfig codeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey).get(); NullPointerException npe = assertThrows( NullPointerException.class, () -> CodeOwnerConfigFileJson.format( - codeOwnerConfigKey, + codeOwnerConfig, /* resolvedImports= */ ImmutableList.of(), /* unresolvedImports= */ null)); assertThat(npe).hasMessageThat().isEqualTo("unresolvedImports"); @@ -83,6 +104,18 @@ @Test public void formatWithoutImports() throws Exception { + testFormatWithoutImports(/* expectWebLinks= */ false); + } + + @Test + public void formatWithoutImports_WithWebLinks() throws Exception { + try (Registration registration = + extensionRegistry.newRegistration().add(new CodeOwnersConfigFileWebLink())) { + testFormatWithoutImports(/* expectWebLinks= */ true); + } + } + + private void testFormatWithoutImports(boolean expectWebLinks) throws Exception { CodeOwnerConfig.Key codeOwnerConfigKey = codeOwnerConfigOperations .newCodeOwnerConfig() @@ -91,10 +124,12 @@ .folderPath("/foo/baz/") .addCodeOwnerEmail(admin.email()) .create(); + CodeOwnerConfig codeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey).get(); CodeOwnerConfigFileInfo codeOwnerConfigFileInfo = CodeOwnerConfigFileJson.format( - codeOwnerConfigKey, + codeOwnerConfig, /* resolvedImports= */ ImmutableList.of(), /* unresolvedImports= */ ImmutableList.of()); assertThat(codeOwnerConfigFileInfo.project).isEqualTo(codeOwnerConfigKey.project().get()); @@ -106,11 +141,29 @@ assertThat(codeOwnerConfigFileInfo.imports).isNull(); assertThat(codeOwnerConfigFileInfo.unresolvedImports).isNull(); assertThat(codeOwnerConfigFileInfo.unresolvedErrorMessage).isNull(); + + if (expectWebLinks) { + assertThat(codeOwnerConfigFileInfo.webLinks).containsExactly(createWebLink(codeOwnerConfig)); + } else { + assertThat(codeOwnerConfigFileInfo.webLinks).isNull(); + } } @Test public void formatWithUnresolvedImports() throws Exception { - CodeOwnerConfig.Key codeOwnerConfigKey = + testFormatWithUnresolvedImports(/* expectWebLinks= */ false); + } + + @Test + public void formatWithUnresolvedImports_WithWebLinks() throws Exception { + try (Registration registration = + extensionRegistry.newRegistration().add(new CodeOwnersConfigFileWebLink())) { + testFormatWithUnresolvedImports(/* expectWebLinks= */ true); + } + } + + private void testFormatWithUnresolvedImports(boolean expectWebLinks) throws Exception { + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -118,6 +171,8 @@ .folderPath("/foo/bar/") .addCodeOwnerEmail(admin.email()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); CodeOwnerConfig.Key keyOfImportedCodeOwnerConfig = CodeOwnerConfig.Key.create(project, "stable", "/foo/baz/"); @@ -127,19 +182,21 @@ CodeOwnerConfigFileInfo codeOwnerConfigFileInfo = CodeOwnerConfigFileJson.format( - codeOwnerConfigKey, + importingCodeOwnerConfig, /* resolvedImports= */ ImmutableList.of(), /* unresolvedImports= */ ImmutableList.of( CodeOwnerConfigImport.createUnresolvedImport( - codeOwnerConfigKey, + importingCodeOwnerConfig, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference, "error message"))); - assertThat(codeOwnerConfigFileInfo.project).isEqualTo(codeOwnerConfigKey.project().get()); + assertThat(codeOwnerConfigFileInfo.project) + .isEqualTo(keyOfImportingCodeOwnerConfig.project().get()); assertThat(codeOwnerConfigFileInfo.branch) - .isEqualTo(codeOwnerConfigKey.branchNameKey().branch()); + .isEqualTo(keyOfImportingCodeOwnerConfig.branchNameKey().branch()); assertThat(codeOwnerConfigFileInfo.path) - .isEqualTo(codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey).getFilePath()); + .isEqualTo( + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).getFilePath()); assertThat(codeOwnerConfigFileInfo.importMode).isNull(); assertThat(codeOwnerConfigFileInfo.imports).isNull(); assertThat(codeOwnerConfigFileInfo.unresolvedErrorMessage).isNull(); @@ -158,11 +215,32 @@ assertThat(unresolvedImportInfo.imports).isNull(); assertThat(unresolvedImportInfo.unresolvedImports).isNull(); assertThat(unresolvedImportInfo.unresolvedErrorMessage).isEqualTo("error message"); + + if (expectWebLinks) { + assertThat(codeOwnerConfigFileInfo.webLinks) + .containsExactly(createWebLink(importingCodeOwnerConfig)); + assertThat(unresolvedImportInfo.webLinks).isNull(); + } else { + assertThat(codeOwnerConfigFileInfo.webLinks).isNull(); + assertThat(unresolvedImportInfo.webLinks).isNull(); + } } @Test public void formatWithImports() throws Exception { - CodeOwnerConfig.Key codeOwnerConfigKey = + testFormatWithImports(/* expectWebLinks= */ false); + } + + @Test + public void formatWithImports_WithWebLinks() throws Exception { + try (Registration registration = + extensionRegistry.newRegistration().add(new CodeOwnersConfigFileWebLink())) { + testFormatWithImports(/* expectWebLinks= */ true); + } + } + + private void testFormatWithImports(boolean expectWebLinks) throws Exception { + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -170,25 +248,38 @@ .folderPath("/foo/bar/") .addCodeOwnerEmail(admin.email()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); + createBranch(BranchNameKey.create(project, "stable")); CodeOwnerConfig.Key keyOfImportedCodeOwnerConfig = - CodeOwnerConfig.Key.create(project, "stable", "/foo/baz/"); + codeOwnerConfigOperations + .newCodeOwnerConfig() + .project(project) + .branch("stable") + .folderPath("/foo/baz/") + .addCodeOwnerEmail(admin.email()) + .create(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); CodeOwnerConfigReference codeOwnerConfigReference = createCodeOwnerConfigReference( CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); CodeOwnerConfigFileInfo codeOwnerConfigFileInfo = CodeOwnerConfigFileJson.format( - codeOwnerConfigKey, + importingCodeOwnerConfig, /* resolvedImports= */ ImmutableList.of( CodeOwnerConfigImport.createResolvedImport( - codeOwnerConfigKey, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference)), + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference)), /* unresolvedImports= */ ImmutableList.of()); - assertThat(codeOwnerConfigFileInfo.project).isEqualTo(codeOwnerConfigKey.project().get()); + assertThat(codeOwnerConfigFileInfo.project) + .isEqualTo(keyOfImportingCodeOwnerConfig.project().get()); assertThat(codeOwnerConfigFileInfo.branch) - .isEqualTo(codeOwnerConfigKey.branchNameKey().branch()); + .isEqualTo(keyOfImportingCodeOwnerConfig.branchNameKey().branch()); assertThat(codeOwnerConfigFileInfo.path) - .isEqualTo(codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey).getFilePath()); + .isEqualTo( + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).getFilePath()); assertThat(codeOwnerConfigFileInfo.importMode).isNull(); assertThat(codeOwnerConfigFileInfo.unresolvedImports).isNull(); assertThat(codeOwnerConfigFileInfo.unresolvedErrorMessage).isNull(); @@ -206,11 +297,33 @@ assertThat(resolvedImportInfo.imports).isNull(); assertThat(resolvedImportInfo.unresolvedImports).isNull(); assertThat(resolvedImportInfo.unresolvedErrorMessage).isNull(); + + if (expectWebLinks) { + assertThat(codeOwnerConfigFileInfo.webLinks) + .containsExactly(createWebLink(importingCodeOwnerConfig)); + assertThat(resolvedImportInfo.webLinks) + .containsExactly(createWebLink(importedCodeOwnerConfig)); + } else { + assertThat(codeOwnerConfigFileInfo.webLinks).isNull(); + assertThat(resolvedImportInfo.webLinks).isNull(); + } } @Test public void formatWithNestedImports() throws Exception { - CodeOwnerConfig.Key codeOwnerConfigKey = + testFormatWithNestedImports(/* expectWebLinks= */ false); + } + + @Test + public void formatWithNestedImports_WithWebLinks() throws Exception { + try (Registration registration = + extensionRegistry.newRegistration().add(new CodeOwnersConfigFileWebLink())) { + testFormatWithNestedImports(/* expectWebLinks= */ true); + } + } + + private void testFormatWithNestedImports(boolean expectWebLinks) throws Exception { + CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = codeOwnerConfigOperations .newCodeOwnerConfig() .project(project) @@ -218,6 +331,8 @@ .folderPath("/foo/bar/") .addCodeOwnerEmail(admin.email()) .create(); + CodeOwnerConfig importingCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).get(); CodeOwnerConfig.Key keyOfImportedCodeOwnerConfig = codeOwnerConfigOperations @@ -227,12 +342,23 @@ .folderPath("/foo/bar/baz") .addCodeOwnerEmail(admin.email()) .create(); + CodeOwnerConfig importedCodeOwnerConfig = + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportedCodeOwnerConfig).get(); CodeOwnerConfigReference codeOwnerConfigReference = createCodeOwnerConfigReference( CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, keyOfImportedCodeOwnerConfig); + createBranch(BranchNameKey.create(project, "stable")); CodeOwnerConfig.Key keyOfNestedImportedCodeOwnerConfig1 = - CodeOwnerConfig.Key.create(project, "stable", "/foo/baz1/"); + codeOwnerConfigOperations + .newCodeOwnerConfig() + .project(project) + .branch("stable") + .folderPath("/foo/baz1/") + .addCodeOwnerEmail(admin.email()) + .create(); + CodeOwnerConfig nestedImportedCodeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(keyOfNestedImportedCodeOwnerConfig1).get(); CodeOwnerConfigReference nestedCodeOwnerConfigReference1 = createCodeOwnerConfigReference( CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, @@ -246,25 +372,27 @@ CodeOwnerConfigFileInfo codeOwnerConfigFileInfo = CodeOwnerConfigFileJson.format( - codeOwnerConfigKey, + importingCodeOwnerConfig, /* resolvedImports= */ ImmutableList.of( CodeOwnerConfigImport.createResolvedImport( - codeOwnerConfigKey, keyOfImportedCodeOwnerConfig, codeOwnerConfigReference), + importingCodeOwnerConfig, importedCodeOwnerConfig, codeOwnerConfigReference), CodeOwnerConfigImport.createResolvedImport( - keyOfImportedCodeOwnerConfig, - keyOfNestedImportedCodeOwnerConfig1, + importedCodeOwnerConfig, + nestedImportedCodeOwnerConfig1, nestedCodeOwnerConfigReference1)), /* unresolvedImports= */ ImmutableList.of( CodeOwnerConfigImport.createUnresolvedImport( - keyOfImportedCodeOwnerConfig, + importedCodeOwnerConfig, keyOfNestedImportedCodeOwnerConfig2, nestedCodeOwnerConfigReference2, "error message"))); - assertThat(codeOwnerConfigFileInfo.project).isEqualTo(codeOwnerConfigKey.project().get()); + assertThat(codeOwnerConfigFileInfo.project) + .isEqualTo(keyOfImportingCodeOwnerConfig.project().get()); assertThat(codeOwnerConfigFileInfo.branch) - .isEqualTo(codeOwnerConfigKey.branchNameKey().branch()); + .isEqualTo(keyOfImportingCodeOwnerConfig.branchNameKey().branch()); assertThat(codeOwnerConfigFileInfo.path) - .isEqualTo(codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey).getFilePath()); + .isEqualTo( + codeOwnerConfigOperations.codeOwnerConfig(keyOfImportingCodeOwnerConfig).getFilePath()); assertThat(codeOwnerConfigFileInfo.importMode).isNull(); assertThat(codeOwnerConfigFileInfo.unresolvedImports).isNull(); assertThat(codeOwnerConfigFileInfo.unresolvedErrorMessage).isNull(); @@ -316,10 +444,37 @@ assertThat(nestedUnresolvedImportInfo1.imports).isNull(); assertThat(nestedUnresolvedImportInfo1.unresolvedImports).isNull(); assertThat(nestedUnresolvedImportInfo1.unresolvedErrorMessage).isEqualTo("error message"); + + if (expectWebLinks) { + assertThat(codeOwnerConfigFileInfo.webLinks) + .containsExactly(createWebLink(importingCodeOwnerConfig)); + assertThat(resolvedImportInfo.webLinks) + .containsExactly(createWebLink(importedCodeOwnerConfig)); + assertThat(nestedResolvedImportInfo.webLinks) + .containsExactly(createWebLink(nestedImportedCodeOwnerConfig1)); + assertThat(nestedUnresolvedImportInfo1.webLinks).isNull(); + } else { + assertThat(codeOwnerConfigFileInfo.webLinks).isNull(); + assertThat(resolvedImportInfo.webLinks).isNull(); + assertThat(nestedResolvedImportInfo.webLinks).isNull(); + assertThat(nestedUnresolvedImportInfo1.webLinks).isNull(); + } } @Test public void formatWithCyclicImports() throws Exception { + testFormatWithCyclicImports(/* expectWebLinks= */ false); + } + + @Test + public void formatWithCyclicImports_WithWebLinks() throws Exception { + try (Registration registration = + extensionRegistry.newRegistration().add(new CodeOwnersConfigFileWebLink())) { + testFormatWithCyclicImports(/* expectWebLinks= */ true); + } + } + + private void testFormatWithCyclicImports(boolean expectWebLinks) throws Exception { CodeOwnerConfig.Key codeOwnerConfigKey1 = codeOwnerConfigOperations .newCodeOwnerConfig() @@ -328,6 +483,8 @@ .folderPath("/foo/bar/") .addCodeOwnerEmail(admin.email()) .create(); + CodeOwnerConfig codeOwnerConfig1 = + codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey1).get(); CodeOwnerConfigReference codeOwnerConfigReference1 = createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, codeOwnerConfigKey1); @@ -339,17 +496,19 @@ .folderPath("/foo/bar/baz") .addCodeOwnerEmail(admin.email()) .create(); + CodeOwnerConfig codeOwnerConfig2 = + codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfigKey2).get(); CodeOwnerConfigReference codeOwnerConfigReference2 = createCodeOwnerConfigReference(CodeOwnerConfigImportMode.ALL, codeOwnerConfigKey2); CodeOwnerConfigFileInfo codeOwnerConfigFileInfo = CodeOwnerConfigFileJson.format( - codeOwnerConfigKey1, + codeOwnerConfig1, /* resolvedImports= */ ImmutableList.of( CodeOwnerConfigImport.createResolvedImport( - codeOwnerConfigKey1, codeOwnerConfigKey2, codeOwnerConfigReference1), + codeOwnerConfig1, codeOwnerConfig2, codeOwnerConfigReference1), CodeOwnerConfigImport.createResolvedImport( - codeOwnerConfigKey2, codeOwnerConfigKey1, codeOwnerConfigReference2)), + codeOwnerConfig2, codeOwnerConfig1, codeOwnerConfigReference2)), /* unresolvedImports= */ ImmutableList.of()); assertThat(codeOwnerConfigFileInfo.project).isEqualTo(codeOwnerConfigKey1.project().get()); @@ -384,5 +543,40 @@ assertThat(nestedResolvedImportInfo.imports).isNull(); assertThat(nestedResolvedImportInfo.unresolvedImports).isNull(); assertThat(nestedResolvedImportInfo.unresolvedErrorMessage).isNull(); + + if (expectWebLinks) { + assertThat(codeOwnerConfigFileInfo.webLinks).containsExactly(createWebLink(codeOwnerConfig1)); + assertThat(resolvedImportInfo.webLinks).containsExactly(createWebLink(codeOwnerConfig2)); + assertThat(nestedResolvedImportInfo.webLinks) + .containsExactly(createWebLink(codeOwnerConfig1)); + } else { + assertThat(codeOwnerConfigFileInfo.webLinks).isNull(); + assertThat(resolvedImportInfo.webLinks).isNull(); + assertThat(nestedResolvedImportInfo.webLinks).isNull(); + } + } + + private WebLinkInfo createWebLink(CodeOwnerConfig codeOwnerConfig) { + return createWebLink( + codeOwnerConfig.key().project().get(), + codeOwnerConfig.key().branchNameKey().branch(), + codeOwnerConfig.revision().getName(), + codeOwnerConfigOperations.codeOwnerConfig(codeOwnerConfig.key()).getFilePath()); + } + + private WebLinkInfo createWebLink( + String projectName, String revision, String hash, String fileName) { + return new WebLinkInfo( + "name", + "imageURL", + "http://view/" + projectName + "/" + revision + "/" + hash + "/" + fileName); + } + + private class CodeOwnersConfigFileWebLink implements FileWebLink { + @Override + public WebLinkInfo getFileWebLink( + String projectName, String revision, String hash, String fileName) { + return createWebLink(projectName, revision, hash, fileName); + } } }
diff --git a/resources/Documentation/rest-api.md b/resources/Documentation/rest-api.md index ace28a0..d694667 100644 --- a/resources/Documentation/rest-api.md +++ b/resources/Documentation/rest-api.md
@@ -959,14 +959,15 @@ The `CodeOwnerConfigFileInfo` entity contains information about a code owner config file and its imports. -| Field Name | | Description | -| ---------- | -------- | ----------- | -| `project` || The name of the project from which the code owner config was loaded, or for unresolved imports, from which the code owner config was supposed to be loaded. -| `branch` || The name of the branch from which the code owner config was loaded, or for unresolved imports, from which the code owner config was supposed to be loaded. -| `path` || The absolute path of the code owner config file. -| `imports` | optional | Imported code owner config files as [CodeOwnerConfigFileInfo](#code-owner-config-file-info) entities. +| Field Name | | Description | +| ----------- | -------- | ----------- | +| `project` || The name of the project from which the code owner config was loaded, or for unresolved imports, from which the code owner config was supposed to be loaded. +| `branch` || The name of the branch from which the code owner config was loaded, or for unresolved imports, from which the code owner config was supposed to be loaded. +| `path` || The absolute path of the code owner config file. +| `web_links` | optional | Links to the code owner config file in external sites as a list of [WebLinkInfo](../../../Documentation/rest-api-changes.html#web-link-info) entities. Not set if the `CodeOwnerConfigFileInfo` represents an imported code owner config file that couldn't be resolved or if [web links](../../../Documentation/dev-plugins.html#links-to-external-tools) are not configured. +| `imports` | optional | Imported code owner config files as [CodeOwnerConfigFileInfo](#code-owner-config-file-info) entities. | `unresolved_imports` | optional | Imported code owner config files that couldn't be resolved as [CodeOwnerConfigFileInfo](#code-owner-config-file-info) entities. -| `unresolved_error_message` | optional | Message explaining why this code owner config couldn't be resolved. Only set if the `CodeOwnerConfigFileInfo` represents an import code owner config file that couldn't be resolved. +| `unresolved_error_message` | optional | Message explaining why this code owner config couldn't be resolved. Only set if the `CodeOwnerConfigFileInfo` represents an imported code owner config file that couldn't be resolved. | `import_mode` | optional | The import mode (`ALL` or `GLOBAL_CODE_OWNER_SETS_ONLY`). Only set if the `CodeOwnerConfigFileInfo` represents an imported code owner config file. ---