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"));

Reply via email to