Fix NPE if OWNERS file imports '/' instead of '/OWNERS'
An import in an OWNERS file must specify the file name of the imported
OWNERS file. This means to import the OWNERS file from the root
directory '/OWNERS' must be imported. Trying to attempt importing the
root folder '/' failed with a NPE because the file name of the path is
null in this case. Fix the NPE and return a proper error message in this
case.
Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: Ib92dc40e007ce7a9693896cf394d57adc844db07
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
index 7f9d4c4..dff2506 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
@@ -72,7 +72,7 @@
/** The name of the code owner config file. */
public String fileName() {
- return filePath().getFileName().toString();
+ return Optional.ofNullable(filePath().getFileName()).map(Path::toString).orElse("");
}
/** User-readable string representing this code owner config reference. */
diff --git a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java
index efa94d0..5291479 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java
@@ -1764,6 +1764,50 @@
}
@Test
+ public void cannotUploadConfigWithGlobalImportOfRootFolder() throws Exception {
+ testUploadConfigWithImportOfRootFolder(CodeOwnerConfigImportType.GLOBAL);
+ }
+
+ @Test
+ public void cannotUploadConfigWithPerFileImportOfRootFolder() throws Exception {
+ testUploadConfigWithImportOfRootFolder(CodeOwnerConfigImportType.PER_FILE);
+ }
+
+ private void testUploadConfigWithImportOfRootFolder(CodeOwnerConfigImportType importType)
+ throws Exception {
+ skipTestIfImportsNotSupportedByCodeOwnersBackend();
+
+ // Create a code owner config that wrongly imports the root folder instead of the '/OWNERS'
+ // file.
+ CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = createCodeOwnerConfigKey("/foo/");
+ CodeOwnerConfigReference codeOwnerConfigReference =
+ CodeOwnerConfigReference.builder(
+ CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, /* filePath= */ "/")
+ .build();
+ CodeOwnerConfig codeOwnerConfig =
+ createCodeOwnerConfigWithImport(
+ keyOfImportingCodeOwnerConfig, importType, codeOwnerConfigReference);
+
+ PushOneCommit.Result r =
+ createChange(
+ user,
+ "Add code owners",
+ codeOwnerConfigOperations
+ .codeOwnerConfig(keyOfImportingCodeOwnerConfig)
+ .getJGitFilePath(),
+ format(codeOwnerConfig));
+ assertErrorWithMessages(
+ r,
+ "invalid code owner config files",
+ String.format(
+ "invalid %s import in '%s': '/' is not a code owner config file",
+ importType.getType(),
+ codeOwnerConfigOperations
+ .codeOwnerConfig(keyOfImportingCodeOwnerConfig)
+ .getFilePath()));
+ }
+
+ @Test
public void
forMergeCommitsNonResolvableGlobalImportsFromOtherProjectsAreReportedAsWarningsIfImportsDontSpecifyBranch()
throws Exception {