From 428b4d6234c3b3cec7b827feb513eceb36d34850 Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Wed, 29 Jul 2020 20:25:25 +0200 Subject: [PATCH] Fix #42 mvnd fails if there is no .mvn/ dir in the user home --- .../jboss/fuse/mvnd/client/DaemonConnector.java | 6 +++++- .../org/jboss/fuse/mvnd/client/DefaultClient.java | 3 +-- .../org/jboss/fuse/mvnd/client/Environment.java | 15 ++++++++++----- .../java/org/jboss/fuse/mvnd/client/Message.java | 13 ++----------- .../org/apache/maven/cli/CliRequestBuilder.java | 4 +++- .../java/org/apache/maven/cli/DaemonMavenCli.java | 2 ++ .../java/org/jboss/fuse/mvnd/daemon/Server.java | 3 ++- .../fuse/mvnd/plugin/CliPluginRealmCache.java | 1 - .../org/jboss/fuse/mvnd/it/VersionNativeIT.java | 2 +- .../java/org/jboss/fuse/mvnd/it/VersionTest.java | 2 +- .../jboss/fuse/mvnd/junit/MvndTestExtension.java | 5 ++++- 11 files changed, 31 insertions(+), 25 deletions(-) diff --git a/client/src/main/java/org/jboss/fuse/mvnd/client/DaemonConnector.java b/client/src/main/java/org/jboss/fuse/mvnd/client/DaemonConnector.java index dadeecf26..efc8100ef 100644 --- a/client/src/main/java/org/jboss/fuse/mvnd/client/DaemonConnector.java +++ b/client/src/main/java/org/jboss/fuse/mvnd/client/DaemonConnector.java @@ -255,7 +255,11 @@ private String startDaemon() { if (timeout != null) { args.add(Environment.DAEMON_IDLE_TIMEOUT.asCommandLineProperty(timeout)); } - args.add("\"-Dmaven.multiModuleProjectDirectory=" + layout.multiModuleProjectDirectory().toString() + "\""); + + final Path multiModuleProjectDirectory = layout.multiModuleProjectDirectory(); + if (multiModuleProjectDirectory != null) { + args.add("\"-Dmaven.multiModuleProjectDirectory=" + multiModuleProjectDirectory.toString() + "\""); + } args.add(ServerMain.class.getName()); command = String.join(" ", args); diff --git a/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java b/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java index 9df1aa893..f54e20e72 100644 --- a/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java +++ b/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java @@ -217,8 +217,7 @@ public ExecutionResult execute(ClientOutput output, List argv) { daemon.dispatch(new Message.BuildRequest( args, - layout.userDir().toString(), - layout.multiModuleProjectDirectory().toString())); + layout.userDir().toString())); while (true) { Message m = daemon.receive(); diff --git a/client/src/main/java/org/jboss/fuse/mvnd/client/Environment.java b/client/src/main/java/org/jboss/fuse/mvnd/client/Environment.java index df4eacbc8..53b028c54 100644 --- a/client/src/main/java/org/jboss/fuse/mvnd/client/Environment.java +++ b/client/src/main/java/org/jboss/fuse/mvnd/client/Environment.java @@ -124,12 +124,12 @@ public static Path findMultiModuleProjectDirectory(Path pwd) { } dir = dir.getParent(); } while (dir != null); - throw new IllegalStateException("Could not detect maven.multiModuleProjectDirectory by climbing up from [" - + pwd - + "] seeking a .mvn directory. You may want to create a .mvn directory in the root directory of your source tree."); + /* Return pwd if .mvn directory was not found in the hierarchy. + * Maven does the same thing in mvn shell script's find_maven_basedir() + * and find_file_argument_basedir() routines */ + return pwd.toString(); }) - .asPath() - .toAbsolutePath().normalize(); + .asAbsolutePath(); } public static Path findLogbackConfigurationPath(Supplier mvndProperties, Path mvndPropertiesPath, @@ -269,6 +269,11 @@ public Path asPath() { return result == null ? null : Paths.get(result); } + public Path asAbsolutePath() { + final String result = get(); + return result == null ? null : Paths.get(result).toAbsolutePath().normalize(); + } + public boolean asBoolean() { return Boolean.parseBoolean(get()); } diff --git a/client/src/main/java/org/jboss/fuse/mvnd/client/Message.java b/client/src/main/java/org/jboss/fuse/mvnd/client/Message.java index dccad5fae..a8b8fdc69 100644 --- a/client/src/main/java/org/jboss/fuse/mvnd/client/Message.java +++ b/client/src/main/java/org/jboss/fuse/mvnd/client/Message.java @@ -36,12 +36,10 @@ public long timestamp() { public static class BuildRequest extends Message { final List args; final String workingDir; - final String projectDir; - public BuildRequest(List args, String workingDir, String projectDir) { + public BuildRequest(List args, String workingDir) { this.args = args; this.workingDir = workingDir; - this.projectDir = projectDir; } public List getArgs() { @@ -52,16 +50,11 @@ public String getWorkingDir() { return workingDir; } - public String getProjectDir() { - return projectDir; - } - @Override public String toString() { return "BuildRequest{" + "args=" + args + ", workingDir='" + workingDir + '\'' + - ", projectDir='" + projectDir + '\'' + '}'; } } @@ -212,14 +205,12 @@ public void write(DataOutputStream output, Message value) throws Exception { private BuildRequest readBuildRequest(DataInputStream input) throws IOException { List args = readStringList(input); String workingDir = readUTF(input); - String projectDir = readUTF(input); - return new BuildRequest(args, workingDir, projectDir); + return new BuildRequest(args, workingDir); } private void writeBuildRequest(DataOutputStream output, BuildRequest value) throws IOException { writeStringList(output, value.args); writeUTF(output, value.workingDir); - writeUTF(output, value.projectDir); } private BuildEvent readBuildEvent(DataInputStream input) throws IOException { diff --git a/daemon/src/main/java/org/apache/maven/cli/CliRequestBuilder.java b/daemon/src/main/java/org/apache/maven/cli/CliRequestBuilder.java index 625d06575..07f481bb7 100644 --- a/daemon/src/main/java/org/apache/maven/cli/CliRequestBuilder.java +++ b/daemon/src/main/java/org/apache/maven/cli/CliRequestBuilder.java @@ -40,7 +40,9 @@ public CliRequestBuilder workingDirectory(Path workingDirectory) { } public CliRequestBuilder projectDirectory(Path projectDirectory) { - request.multiModuleProjectDirectory = projectDirectory.toAbsolutePath().toFile(); + if (projectDirectory != null) { + request.multiModuleProjectDirectory = projectDirectory.toAbsolutePath().toFile(); + } return this; } diff --git a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java index 74a5f0f2a..64ce8efb7 100644 --- a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java +++ b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java @@ -160,6 +160,8 @@ public DaemonMavenCli() throws Exception { // TODO need to externalize CliRequest public int doMain(CliRequest cliRequest) throws Exception { + LoggerFactory.getLogger(DaemonMavenCli.class).warn("doMain"); + Properties props = (Properties) System.getProperties().clone(); try { initialize(cliRequest); diff --git a/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java b/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java index 8db11966b..ad4642f95 100644 --- a/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java +++ b/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java @@ -387,7 +387,7 @@ private void handle(DaemonConnection connection, BuildRequest buildRequ CliRequest req = new CliRequestBuilder() .arguments(buildRequest.getArgs()) .workingDirectory(Paths.get(buildRequest.getWorkingDir())) - .projectDirectory(Paths.get(buildRequest.getProjectDir())) + .projectDirectory(layout.multiModuleProjectDirectory()) .build(); PriorityBlockingQueue queue = new PriorityBlockingQueue(64, @@ -417,6 +417,7 @@ private void handle(DaemonConnection connection, BuildRequest buildRequ }); pumper.start(); try { + LOGGER.info("before doMain"); cli.doMain(req); LOGGER.info("Build finished, finishing message dispatch"); loggingSpy.finish(); diff --git a/daemon/src/main/java/org/jboss/fuse/mvnd/plugin/CliPluginRealmCache.java b/daemon/src/main/java/org/jboss/fuse/mvnd/plugin/CliPluginRealmCache.java index 386f8c3f3..191504a5f 100644 --- a/daemon/src/main/java/org/jboss/fuse/mvnd/plugin/CliPluginRealmCache.java +++ b/daemon/src/main/java/org/jboss/fuse/mvnd/plugin/CliPluginRealmCache.java @@ -20,7 +20,6 @@ import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; import java.net.URL; import java.nio.file.FileSystems; import java.nio.file.Files; diff --git a/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionNativeIT.java b/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionNativeIT.java index 4d0de95c9..c057bc5ee 100644 --- a/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionNativeIT.java +++ b/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionNativeIT.java @@ -28,7 +28,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; -@MvndNativeTest(projectDir = "src/test/projects/single-module") +@MvndNativeTest(projectDir = MvndTestExtension.TEMP_EXTERNAL) public class VersionNativeIT { @Inject diff --git a/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionTest.java b/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionTest.java index cf392a2a5..40b48acf4 100644 --- a/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionTest.java +++ b/integration-tests/src/test/java/org/jboss/fuse/mvnd/it/VersionTest.java @@ -18,7 +18,7 @@ import org.jboss.fuse.mvnd.junit.MvndTest; import org.jboss.fuse.mvnd.junit.MvndTestExtension; -@MvndTest(projectDir = "src/test/projects/single-module") +@MvndTest(projectDir = MvndTestExtension.TEMP_EXTERNAL) public class VersionTest extends VersionNativeIT { } diff --git a/integration-tests/src/test/java/org/jboss/fuse/mvnd/junit/MvndTestExtension.java b/integration-tests/src/test/java/org/jboss/fuse/mvnd/junit/MvndTestExtension.java index 92010ffa2..50691e4a7 100644 --- a/integration-tests/src/test/java/org/jboss/fuse/mvnd/junit/MvndTestExtension.java +++ b/integration-tests/src/test/java/org/jboss/fuse/mvnd/junit/MvndTestExtension.java @@ -138,12 +138,14 @@ public static MvndResource create(String className, String rawProjectDir, boolea final Path testDir = Paths.get("target/mvnd-tests/" + className).toAbsolutePath(); Files.createDirectories(testDir); final Path testExecutionDir; + final Path multiModuleProjectDirectory; if (TEMP_EXTERNAL.equals(rawProjectDir)) { try { testExecutionDir = Files.createTempDirectory(MvndTestExtension.class.getSimpleName()); } catch (IOException e) { throw new RuntimeException("Could not create temporary directory", e); } + multiModuleProjectDirectory = null; } else { final Path mvndTestSrcDir = Paths.get(rawProjectDir).toAbsolutePath().normalize(); if (!Files.exists(mvndTestSrcDir)) { @@ -151,6 +153,7 @@ public static MvndResource create(String className, String rawProjectDir, boolea + "\") points at a path that does not exist: " + mvndTestSrcDir); } testExecutionDir = testDir.resolve("project"); + multiModuleProjectDirectory = testExecutionDir; try (Stream files = Files.walk(mvndTestSrcDir)) { files.forEach(source -> { final Path dest = testExecutionDir.resolve(mvndTestSrcDir.relativize(source)); @@ -183,7 +186,7 @@ public static MvndResource create(String className, String rawProjectDir, boolea mvndPropertiesPath, mvndHome, testExecutionDir, - testExecutionDir, + multiModuleProjectDirectory, Paths.get(System.getProperty("java.home")).toAbsolutePath().normalize(), localMavenRepository, settingsPath, mvndHome.resolve("conf/logging/logback.xml"));