diff --git a/devtools/cli/src/main/java/io/quarkus/cli/CreateApp.java b/devtools/cli/src/main/java/io/quarkus/cli/CreateApp.java index 30d5ec3c66b24..53413ac249af4 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/CreateApp.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/CreateApp.java @@ -58,7 +58,7 @@ public Integer call() throws Exception { createProject.setSingleProjectGAV(gav); createProject.setTestOutputDirectory(output.getTestDirectory()); - if (createProject.checkProjectRootAlreadyExists(output)) { + if (createProject.checkProjectRootAlreadyExists(output, runMode.isDryRun())) { return CommandLine.ExitCode.USAGE; } diff --git a/devtools/cli/src/main/java/io/quarkus/cli/CreateCli.java b/devtools/cli/src/main/java/io/quarkus/cli/CreateCli.java index 9f97578ee46d4..29265e35f2ce1 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/CreateCli.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/CreateCli.java @@ -60,7 +60,7 @@ public Integer call() throws Exception { createProject.setSingleProjectGAV(gav); createProject.setTestOutputDirectory(output.getTestDirectory()); - if (createProject.checkProjectRootAlreadyExists(output)) { + if (createProject.checkProjectRootAlreadyExists(output, false)) { return CommandLine.ExitCode.USAGE; } diff --git a/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java b/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java index 0b1fbcd53bd8c..0612d7e79096c 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java @@ -11,6 +11,7 @@ import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.PropertiesOptions; +import io.quarkus.registry.config.RegistriesConfigLocator; import io.quarkus.runtime.QuarkusApplication; import io.quarkus.runtime.annotations.QuarkusMain; import picocli.CommandLine; @@ -47,6 +48,12 @@ public class QuarkusCli implements QuarkusApplication, Callable { @CommandLine.ArgGroup(exclusive = false, validate = false) protected PropertiesOptions propertiesOptions = new PropertiesOptions(); + @CommandLine.Option(names = { + "--tools-config" }, description = "Quarkus Tools configuration file", hidden = true, scope = CommandLine.ScopeType.INHERIT) + void setToolsConfig(String toolsConfig) { + System.setProperty(RegistriesConfigLocator.CONFIG_FILE_PATH_PROPERTY, toolsConfig); + } + @Override public int run(String... args) throws Exception { CommandLine cmd = factory == null ? new CommandLine(this) : new CommandLine(this, factory); diff --git a/devtools/cli/src/main/java/io/quarkus/cli/Registry.java b/devtools/cli/src/main/java/io/quarkus/cli/Registry.java index 12abe2b503b73..210a7debad06f 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/Registry.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/Registry.java @@ -3,7 +3,6 @@ import java.util.List; import io.quarkus.cli.registry.BaseRegistryCommand; -import io.quarkus.cli.registry.RegistryListCommand; import picocli.CommandLine; import picocli.CommandLine.ParseResult; import picocli.CommandLine.Unmatched; diff --git a/devtools/cli/src/main/java/io/quarkus/cli/registry/RegistryListCommand.java b/devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java similarity index 80% rename from devtools/cli/src/main/java/io/quarkus/cli/registry/RegistryListCommand.java rename to devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java index 4e2bb5cbbff6b..e62137e303aa4 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/registry/RegistryListCommand.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java @@ -1,8 +1,9 @@ -package io.quarkus.cli.registry; +package io.quarkus.cli; import java.nio.file.Path; -import io.quarkus.cli.common.RegistryClientMixin; +import io.quarkus.cli.registry.BaseRegistryCommand; +import io.quarkus.cli.registry.RegistryClientMixin; import io.quarkus.registry.config.RegistriesConfig; import io.quarkus.registry.config.RegistriesConfigLocator; import io.quarkus.registry.config.RegistryConfig; @@ -19,14 +20,15 @@ public class RegistryListCommand extends BaseRegistryCommand { public Integer call() throws Exception { registryClient.refreshRegistryCache(output); - - output.info("Available Quarkus extension registries:"); final RegistriesConfig config = RegistriesConfigLocator.resolveConfig(); + + output.info("Configured Quarkus extension registries:"); for (RegistryConfig r : config.getRegistries()) { if (r.isDisabled()) { - continue; + output.info("- " + r.getId() + " (disabled)"); + } else { + output.info("- " + r.getId()); } - output.info("- " + r.getId()); } final Path configYaml = RegistriesConfigLocator.locateConfigYaml(); diff --git a/devtools/cli/src/main/java/io/quarkus/cli/build/BaseBuildCommand.java b/devtools/cli/src/main/java/io/quarkus/cli/build/BaseBuildCommand.java index bb3dbac721426..f9fe842b3b5d7 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/build/BaseBuildCommand.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/build/BaseBuildCommand.java @@ -6,7 +6,7 @@ import io.quarkus.cli.common.HelpOption; import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.PropertiesOptions; -import io.quarkus.cli.common.ToggleRegistryClientMixin; +import io.quarkus.cli.registry.ToggleRegistryClientMixin; import io.quarkus.devtools.project.BuildTool; import io.quarkus.devtools.project.QuarkusProjectHelper; import picocli.CommandLine; diff --git a/devtools/cli/src/main/java/io/quarkus/cli/build/BuildSystemRunner.java b/devtools/cli/src/main/java/io/quarkus/cli/build/BuildSystemRunner.java index 76b0081db06f7..dc984f53e0333 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/build/BuildSystemRunner.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/build/BuildSystemRunner.java @@ -18,8 +18,8 @@ import io.quarkus.cli.common.ListFormatOptions; import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.PropertiesOptions; -import io.quarkus.cli.common.RegistryClientMixin; import io.quarkus.cli.common.RunModeOption; +import io.quarkus.cli.registry.RegistryClientMixin; import io.quarkus.devtools.project.BuildTool; import picocli.CommandLine; diff --git a/devtools/cli/src/main/java/io/quarkus/cli/build/JBangRunner.java b/devtools/cli/src/main/java/io/quarkus/cli/build/JBangRunner.java index 592b34838181e..61ff9d5340200 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/build/JBangRunner.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/build/JBangRunner.java @@ -14,8 +14,8 @@ import io.quarkus.cli.common.ListFormatOptions; import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.PropertiesOptions; -import io.quarkus.cli.common.RegistryClientMixin; import io.quarkus.cli.common.RunModeOption; +import io.quarkus.cli.registry.RegistryClientMixin; import io.quarkus.devtools.project.BuildTool; public class JBangRunner implements BuildSystemRunner { diff --git a/devtools/cli/src/main/java/io/quarkus/cli/create/CreateProjectMixin.java b/devtools/cli/src/main/java/io/quarkus/cli/create/CreateProjectMixin.java index cb50b7cfa96e7..47c4c0d64e927 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/create/CreateProjectMixin.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/create/CreateProjectMixin.java @@ -8,7 +8,7 @@ import io.quarkus.cli.common.OutputOptionMixin; import io.quarkus.cli.common.TargetQuarkusVersionGroup; -import io.quarkus.cli.common.ToggleRegistryClientMixin; +import io.quarkus.cli.registry.ToggleRegistryClientMixin; import io.quarkus.devtools.commands.CreateProject; import io.quarkus.devtools.commands.data.QuarkusCommandInvocation; import io.quarkus.devtools.project.BuildTool; @@ -56,18 +56,24 @@ public Path outputDirectory() { * Resolve and remember the configured project directory. * * @param log Output Mixin that will be used to emit error messages + * @param dryRun * @return true IFF configured project root directory already exists */ - public boolean checkProjectRootAlreadyExists(OutputOptionMixin log) { + public boolean checkProjectRootAlreadyExists(OutputOptionMixin log, boolean dryRun) { if (projectRootPath == null) { try { - projectRootPath = CreateProjectHelper.checkProjectRootPath(outputDirectory(), projectDirName); + projectRootPath = CreateProjectHelper.checkProjectRootPath(outputDirectory(), projectDirName, dryRun); return false; } catch (IllegalArgumentException iex) { - log.error(iex.getMessage()); - log.out().printf("Use '-a' or '--artifactId' to choose a new artifactId and directory name.%n"); - log.out().printf("See '%s --help' for more information.%n", mixee.qualifiedName()); - return true; + if (dryRun) { + log.warn("A directory named '" + projectDirName + "' already exists."); + projectRootPath = outputDirectory().resolve(projectDirName); + } else { + log.error(iex.getMessage()); + log.out().printf("Specify a different artifactId / directory name.%n"); + log.out().printf("See '%s --help' for more information.%n", mixee.qualifiedName()); + return true; + } } } return false; @@ -75,7 +81,7 @@ public boolean checkProjectRootAlreadyExists(OutputOptionMixin log) { public Path projectRoot() { if (projectRootPath == null) { - projectRootPath = CreateProjectHelper.checkProjectRootPath(outputDirectory(), projectDirName); + projectRootPath = CreateProjectHelper.checkProjectRootPath(outputDirectory(), projectDirName, false); } return projectRootPath; } diff --git a/devtools/cli/src/main/java/io/quarkus/cli/common/RegistryClientMixin.java b/devtools/cli/src/main/java/io/quarkus/cli/registry/RegistryClientMixin.java similarity index 96% rename from devtools/cli/src/main/java/io/quarkus/cli/common/RegistryClientMixin.java rename to devtools/cli/src/main/java/io/quarkus/cli/registry/RegistryClientMixin.java index dec647febaa80..13a6252a278bc 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/common/RegistryClientMixin.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/registry/RegistryClientMixin.java @@ -1,8 +1,10 @@ -package io.quarkus.cli.common; +package io.quarkus.cli.registry; import java.nio.file.Path; import io.quarkus.cli.Version; +import io.quarkus.cli.common.OutputOptionMixin; +import io.quarkus.cli.common.TargetQuarkusVersionGroup; import io.quarkus.devtools.project.BuildTool; import io.quarkus.devtools.project.QuarkusProject; import io.quarkus.devtools.project.QuarkusProjectHelper; diff --git a/devtools/cli/src/main/java/io/quarkus/cli/common/ToggleRegistryClientMixin.java b/devtools/cli/src/main/java/io/quarkus/cli/registry/ToggleRegistryClientMixin.java similarity index 91% rename from devtools/cli/src/main/java/io/quarkus/cli/common/ToggleRegistryClientMixin.java rename to devtools/cli/src/main/java/io/quarkus/cli/registry/ToggleRegistryClientMixin.java index 49a8ed9e43901..ec0c82d151fc9 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/common/ToggleRegistryClientMixin.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/registry/ToggleRegistryClientMixin.java @@ -1,4 +1,4 @@ -package io.quarkus.cli.common; +package io.quarkus.cli.registry; import picocli.CommandLine; diff --git a/devtools/cli/src/test/java/io/quarkus/cli/CliNonProjectTest.java b/devtools/cli/src/test/java/io/quarkus/cli/CliNonProjectTest.java index 51e2792d7d198..0e31b60e0faa3 100644 --- a/devtools/cli/src/test/java/io/quarkus/cli/CliNonProjectTest.java +++ b/devtools/cli/src/test/java/io/quarkus/cli/CliNonProjectTest.java @@ -1,5 +1,9 @@ package io.quarkus.cli; +import static org.assertj.core.api.Assertions.assertThat; + +import java.net.URISyntaxException; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -10,6 +14,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import io.quarkus.registry.config.RegistriesConfigLocator; import picocli.CommandLine; public class CliNonProjectTest { @@ -30,6 +35,7 @@ public void verifyEmptyDirectory() throws Exception { "Directory list operation should succeed"); Assertions.assertEquals(0, files.length, "Directory should be empty. Found: " + Arrays.toString(files)); + System.clearProperty(RegistriesConfigLocator.CONFIG_FILE_PATH_PROPERTY); } @Test @@ -80,4 +86,44 @@ public void testCreateAppDryRun() throws Exception { Assertions.assertEquals(result.stdout, result2.stdout, "Invoking the command with --dryrun should produce the same result"); } + + @Test + public void testRegistryRefresh() throws Exception { + + // List extensions of a specified platform version + CliDriver.Result result = CliDriver.execute(workspaceRoot, "registry", "--refresh", "-e"); + Assertions.assertEquals(CommandLine.ExitCode.OK, result.exitCode, + "Expected OK return code." + result); + + Path configPath = resolveConfigPath("enabledConfig.yml"); + result = CliDriver.execute(workspaceRoot, "registry", "--refresh", "-e", + "--tools-config", configPath.toAbsolutePath().toString()); + Assertions.assertEquals(CommandLine.ExitCode.OK, result.exitCode, + "Expected OK return code." + result); + Assertions.assertTrue(result.stdout.contains(configPath.toString()), + "Should contain path to config file, found: " + result.stdout); + Assertions.assertTrue(result.stdout.contains("- registry.test.local"), + "Should contain '- registry.test.local', found: " + result.stdout); + Assertions.assertFalse(result.stdout.contains("- registry.quarkus.io"), + "Should not contain '- registry.quarkus.io', found: " + result.stdout); + + configPath = resolveConfigPath("disabledConfig.yml"); + result = CliDriver.execute(workspaceRoot, "registry", "--refresh", "-e", + "--tools-config", configPath.toAbsolutePath().toString()); + Assertions.assertEquals(CommandLine.ExitCode.OK, result.exitCode, + "Expected OK return code." + result); + Assertions.assertTrue(result.stdout.contains(configPath.toString()), + "Should contain path to config file, found: " + result.stdout); + Assertions.assertTrue(result.stdout.contains("- registry.test.local (disabled)"), + "Should contain '- registry.test.local (disabled)', found: " + result.stdout); + Assertions.assertTrue(result.stdout.contains("- registry.quarkus.io"), + "Should contain '- registry.quarkus.io', found: " + result.stdout); + } + + private static Path resolveConfigPath(String configName) throws URISyntaxException { + final URL configUrl = Thread.currentThread().getContextClassLoader().getResource(configName); + assertThat(configUrl).isNotNull(); + final Path path = Paths.get(configUrl.toURI()); + return path; + } } diff --git a/devtools/cli/src/test/java/io/quarkus/cli/CliProjectMavenTest.java b/devtools/cli/src/test/java/io/quarkus/cli/CliProjectMavenTest.java index 53067878adb34..dfd103d379aa1 100644 --- a/devtools/cli/src/test/java/io/quarkus/cli/CliProjectMavenTest.java +++ b/devtools/cli/src/test/java/io/quarkus/cli/CliProjectMavenTest.java @@ -86,6 +86,13 @@ public void testCreateAppOverrides() throws Exception { "result should contain '-Dproperty=value1 -Dproperty2=value2':\n" + result.stdout); CliDriver.invokeValidateBuild(project); + + result = CliDriver.execute(workspaceRoot, "create", "app", "--dry-run", "--verbose", "-e", "-B", + "--output-directory=" + nested, + "silly:my-project:0.1.0"); + Assertions.assertEquals(CommandLine.ExitCode.OK, result.exitCode, "Expected OK return code. " + result); + Assertions.assertTrue(result.stdout.contains("WARN"), + "Expected a warning that the directory already exists. " + result); } @Test diff --git a/devtools/cli/src/test/resources/disabledConfig.yml b/devtools/cli/src/test/resources/disabledConfig.yml new file mode 100644 index 0000000000000..8e944d4f99137 --- /dev/null +++ b/devtools/cli/src/test/resources/disabledConfig.yml @@ -0,0 +1,7 @@ +registries: + - registry.test.local: + update-policy: "always" + disabled: true + maven: + repository: + url: https://registry.quarkus.io/maven \ No newline at end of file diff --git a/devtools/cli/src/test/resources/enabledConfig.yml b/devtools/cli/src/test/resources/enabledConfig.yml new file mode 100644 index 0000000000000..7ab2583008ebe --- /dev/null +++ b/devtools/cli/src/test/resources/enabledConfig.yml @@ -0,0 +1,6 @@ +registries: + - registry.test.local: + update-policy: "always" + maven: + repository: + url: https://registry.quarkus.io/maven \ No newline at end of file diff --git a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/codegen/CreateProjectHelper.java b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/codegen/CreateProjectHelper.java index bd06533112e30..438bd2732711e 100644 --- a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/codegen/CreateProjectHelper.java +++ b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/codegen/CreateProjectHelper.java @@ -41,7 +41,7 @@ public static String checkPackageName(String name) { return name; } - public static Path checkProjectRootPath(Path outputPath, String name) { + public static Path checkProjectRootPath(Path outputPath, String name, boolean dryRun) { requireNonNull(name, "Must specify project name"); requireNonNull(outputPath, "Must specify output path"); diff --git a/independent-projects/tools/registry-client/src/main/java/io/quarkus/registry/config/RegistriesConfigLocator.java b/independent-projects/tools/registry-client/src/main/java/io/quarkus/registry/config/RegistriesConfigLocator.java index 1f8d7241b2907..1eb199dc8e54b 100644 --- a/independent-projects/tools/registry-client/src/main/java/io/quarkus/registry/config/RegistriesConfigLocator.java +++ b/independent-projects/tools/registry-client/src/main/java/io/quarkus/registry/config/RegistriesConfigLocator.java @@ -29,20 +29,21 @@ public class RegistriesConfigLocator { public static final String CONFIG_RELATIVE_PATH = ".quarkus/config.yaml"; - public static final String CONFIG_FILE_PATH_PROPERTY = "qer.config"; + public static final String CONFIG_FILE_PATH_PROPERTY = "quarkus.tools.config"; /** * Locate the registry client configuration file and deserialize it. - * The method will be looking for the file in the following locations in this order: + * + * The method will look for the file in the following locations in this order: *
    - *
  1. if qer.config system property is set, its value will be used as the location of the configuration - * file
  2. + *
  3. if quarkus.config.root system property is set, its value will be + * used as the location of the configuration file
  4. *
  5. current user directory (which usually would be the project dir)
  6. *
  7. .quarkus/config.yaml in the user home directory *
* - * Given that the presence of the configuration file is optional, if the configuration file couldn't be located, - * an empty configuration would be returned to the caller. + * If the configuration file can't be located (it is optional), + * an empty configuration will be returned to the caller. * * @return registry client configuration, never null */ @@ -122,11 +123,9 @@ private static RegistriesConfig completeRequiredConfig(RegistriesConfig original config.addRegistry(getDefaultRegistry()); } else { for (RegistryConfig qerConfig : original.getRegistries()) { - if (!qerConfig.isDisabled()) { - config.addRegistry(completeRequiredConfig(qerConfig)); - } + config.addRegistry(completeRequiredConfig(qerConfig)); } - if (config.isEmpty()) { + if (config.getRegistries().stream().filter(x -> !x.isDisabled()).count() == 0) { config.addRegistry(getDefaultRegistry()); } } @@ -140,6 +139,7 @@ private static RegistryConfig completeRequiredConfig(RegistryConfig original) { final String id = original.getId(); final JsonRegistryConfig config = new JsonRegistryConfig(id); config.setUpdatePolicy(original.getUpdatePolicy()); + config.setDisabled(original.isDisabled()); config.setDescriptor(completeDescriptor(original)); if (original != null) { if (original.getMaven() != null) {