diff --git a/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java b/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java index 6f18d0b365..e645ca9989 100644 --- a/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java +++ b/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java @@ -72,6 +72,7 @@ import org.apache.maven.cli.transfer.Slf4jMavenTransferListener; import org.apache.maven.cling.invoker.mvn.ProtoSession; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.internal.impl.SettingsUtilsV4; +import org.apache.maven.jline.FastTerminal; import org.apache.maven.jline.MessageUtils; import org.apache.maven.logging.LoggingOutputStream; import org.apache.maven.logging.api.LogLevelRecorder; @@ -79,6 +80,8 @@ import org.apache.maven.slf4j.MavenSimpleLogger; import org.eclipse.aether.transfer.TransferListener; import org.jline.terminal.Terminal; import org.jline.terminal.TerminalBuilder; +import org.jline.terminal.impl.AbstractPosixTerminal; +import org.jline.terminal.spi.TerminalExt; import org.slf4j.ILoggerFactory; import org.slf4j.LoggerFactory; import org.slf4j.spi.LocationAwareLogger; @@ -409,26 +412,56 @@ public abstract class LookupInvoker< } protected void helpOrVersionAndMayExit(C context) throws Exception { - Consumer writer = determineWriter(context); R invokerRequest = context.invokerRequest; if (invokerRequest.options().help().isPresent()) { + Consumer writer = determineWriter(context); invokerRequest.options().displayHelp(context.invokerRequest.parserRequest(), writer); throw new ExitException(0); } if (invokerRequest.options().showVersionAndExit().isPresent()) { - if (invokerRequest.options().quiet().orElse(false)) { - writer.accept(CLIReportingUtils.showVersionMinimal()); - } else { - writer.accept(CLIReportingUtils.showVersion()); - } + showVersion(context); throw new ExitException(0); } } + protected void showVersion(C context) { + Consumer writer = determineWriter(context); + R invokerRequest = context.invokerRequest; + if (invokerRequest.options().quiet().orElse(false)) { + writer.accept(CLIReportingUtils.showVersionMinimal()); + } else if (invokerRequest.options().verbose().orElse(false)) { + writer.accept(CLIReportingUtils.showVersion( + ProcessHandle.current().info().commandLine().orElse(null), describe(context.terminal))); + + } else { + writer.accept(CLIReportingUtils.showVersion()); + } + } + + protected String describe(Terminal terminal) { + if (terminal == null) { + return null; + } + if (terminal instanceof FastTerminal ft) { + terminal = ft.getTerminal(); + } + List subs = new ArrayList<>(); + subs.add("type=" + terminal.getType()); + if (terminal instanceof TerminalExt te) { + subs.add("provider=" + te.getProvider().name()); + } + if (terminal instanceof AbstractPosixTerminal pt) { + subs.add("pty=" + pt.getPty().getClass().getName()); + } + return terminal.getClass().getSimpleName() + " (" + String.join(", ", subs) + ")"; + } + protected void preCommands(C context) throws Exception { Options mavenOptions = context.invokerRequest.options(); - if (mavenOptions.verbose().orElse(false) || mavenOptions.showVersion().orElse(false)) { - determineWriter(context).accept(CLIReportingUtils.showVersion()); + boolean verbose = mavenOptions.verbose().orElse(false); + boolean version = mavenOptions.showVersion().orElse(false); + if (verbose || version) { + showVersion(context); } } diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java index 897fc7c5ec..21d2c63d3d 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java @@ -49,6 +49,10 @@ public final class CLIReportingUtils { public static final String BUILD_VERSION_PROPERTY = "version"; public static String showVersion() { + return showVersion(null, null); + } + + public static String showVersion(String commandLine, String terminal) { final String ls = System.lineSeparator(); Properties properties = getBuildProperties(); StringBuilder version = new StringBuilder(256); @@ -78,6 +82,13 @@ public final class CLIReportingUtils { .append("\", family: \"") .append(Os.OS_FAMILY) .append('\"'); + // Add process information using modern Java API + if (commandLine != null) { + version.append(ls).append("Command line: ").append(commandLine); + } + if (terminal != null) { + version.append(ls).append("Terminal: ").append(terminal); + } return version.toString(); }