Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CLI: dry-run dir warn; show disabled registry #18791

Merged
merged 1 commit into from
Jul 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion devtools/cli/src/main/java/io/quarkus/cli/CreateApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion devtools/cli/src/main/java/io/quarkus/cli/CreateCli.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
7 changes: 7 additions & 0 deletions devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -47,6 +48,12 @@ public class QuarkusCli implements QuarkusApplication, Callable<Integer> {
@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);
Expand Down
1 change: 0 additions & 1 deletion devtools/cli/src/main/java/io/quarkus/cli/Registry.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -56,26 +56,32 @@ 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;
}

public Path projectRoot() {
if (projectRootPath == null) {
projectRootPath = CreateProjectHelper.checkProjectRootPath(outputDirectory(), projectDirName);
projectRootPath = CreateProjectHelper.checkProjectRootPath(outputDirectory(), projectDirName, false);
}
return projectRootPath;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.quarkus.cli.common;
package io.quarkus.cli.registry;

import picocli.CommandLine;

Expand Down
46 changes: 46 additions & 0 deletions devtools/cli/src/test/java/io/quarkus/cli/CliNonProjectTest.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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 {
Expand All @@ -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
Expand Down Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions devtools/cli/src/test/resources/disabledConfig.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
registries:
- registry.test.local:
update-policy: "always"
disabled: true
maven:
repository:
url: https://registry.quarkus.io/maven
6 changes: 6 additions & 0 deletions devtools/cli/src/test/resources/enabledConfig.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
registries:
- registry.test.local:
update-policy: "always"
maven:
repository:
url: https://registry.quarkus.io/maven
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
* <ol>
* <li>if <code>qer.config</code> system property is set, its value will be used as the location of the configuration
* file</li>
* <li>if <code>quarkus.config.root</code> system property is set, its value will be
* used as the location of the configuration file</li>
* <li>current user directory (which usually would be the project dir)</li>
* <li><code>.quarkus/config.yaml</code> in the user home directory
* </ol>
*
* 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
*/
Expand Down Expand Up @@ -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());
}
}
Expand All @@ -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) {
Expand Down