This is an automated email from the ASF dual-hosted git repository. slachiewicz pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-mvnd.git
commit 2962aa80fa637e277fb552544d70c6d760b025ff Author: Arturo Bernal <[email protected]> AuthorDate: Wed Oct 28 18:02:16 2026 +0100 Issue #282 Skip connecting to a daemon for --version -v/--version always makes Maven print its own version and return without running a build, regardless of any other arguments, so a daemon round trip cannot change that answer. Return right after printing it instead of still connecting to (and possibly spawning) a daemon just to get the same result back. --help still goes through the daemon: doing that one client-side would mean either hardcoding Maven's CLI help text or generating it from the daemon's bundled Maven/cling version at mvnd's own build time, which is a larger, separate change. --- .../org/mvndaemon/mvnd/client/DefaultClient.java | 13 ++++- .../mvndaemon/mvnd/client/DefaultClientTest.java | 57 ++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java b/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java index 56385952..b8db537b 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java @@ -297,9 +297,18 @@ public class DefaultClient implements Client { output.accept(Message.log(v)); // Print terminal information output.describeTerminal(); + if (version) { + /* + * -v/--version always makes Maven itself print its own version and return without running a + * build, no matter what else is on the command line, so a daemon round trip could not add + * anything here. Skip connecting to (and possibly spawning) a daemon just to get that same + * answer back. + */ + return DefaultResult.success(argv); + } /* - * Do not return, rather pass -v to the server so that the client module does not need to depend on any - * Maven artifacts + * Do not return, rather pass -V/-X to the server so that the client module does not need to depend + * on any Maven artifacts */ } diff --git a/client/src/test/java/org/mvndaemon/mvnd/client/DefaultClientTest.java b/client/src/test/java/org/mvndaemon/mvnd/client/DefaultClientTest.java index 31bb80cc..746f6610 100644 --- a/client/src/test/java/org/mvndaemon/mvnd/client/DefaultClientTest.java +++ b/client/src/test/java/org/mvndaemon/mvnd/client/DefaultClientTest.java @@ -27,10 +27,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.function.Consumer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.mvndaemon.mvnd.common.Environment; +import org.mvndaemon.mvnd.common.Message; +import org.mvndaemon.mvnd.common.logging.ClientOutput; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -38,6 +41,60 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class DefaultClientTest { + /** + * {@code --version} must complete without ever touching a daemon: with no fix, this would try to connect + * to (and possibly spawn) one using the bogus paths below and fail or hang instead of returning quickly. + */ + @Test + void versionDoesNotConnectToDaemon(@TempDir Path dir) { + final Path bogusHome = dir.resolve("no-such-mvnd-home"); + DaemonParameters parameters = new DaemonParameters() { + @Override + public Path mvndHome() { + return bogusHome; + } + + @Override + public Path registry() { + return bogusHome.resolve("registry.bin"); + } + }; + DefaultClient client = new DefaultClient(parameters); + + ExecutionResult result = client.execute(new NoopClientOutput(), Arrays.asList("--version")); + + assertTrue(result.isSuccess()); + assertEquals(0, result.getExitCode()); + } + + private static final class NoopClientOutput implements ClientOutput { + @Override + public void setDaemonId(String daemonId) {} + + @Override + public void setDaemonDispatch(Consumer<Message> sink) {} + + @Override + public void setDaemonReceive(Consumer<Message> sink) {} + + @Override + public void accept(Message message) {} + + @Override + public void accept(List<Message> messages) {} + + @Override + public void describeTerminal() {} + + @Override + public int getTerminalWidth() { + return 80; + } + + @Override + public void close() {} + } + @Test void blankArgumentsAreDropped() { List<String> args = new ArrayList<>(Arrays.asList("clean", "", " ", "install"));
