diff --git a/src/main/java/org/codehaus/plexus/util/cli/Commandline.java b/src/main/java/org/codehaus/plexus/util/cli/Commandline.java index c06147a9..4cd213b0 100644 --- a/src/main/java/org/codehaus/plexus/util/cli/Commandline.java +++ b/src/main/java/org/codehaus/plexus/util/cli/Commandline.java @@ -491,34 +491,32 @@ public String[] getEnvironmentVariables() } /** + * Warning: For built-in commands like 'echo' on {@link Os#FAMILY_WINDOWS}, use cmd /X /C echo + * @deprecated Use {@link org.codehaus.plexus.util.cli.Commandline#getRawCommandline()} method instead. * @return Returns the executable and all defined arguments. - * For Windows Family, {@link Commandline#getShellCommandline()} is returned */ + @Deprecated public String[] getCommandline() { - if ( Os.isFamily( Os.FAMILY_WINDOWS ) ) - { - return getShellCommandline(); - } - return getRawCommandline(); } /** - * Returns the executable and all defined arguments. + * Returns the executable and all defined arguments.
+ * Warning: For built-in commands like 'echo' on {@link Os#FAMILY_WINDOWS}, use cmd /X /C echo * @return the command line as array not escaped neither quoted */ public String[] getRawCommandline() { final String[] args = getArguments(); - String executable = getLiteralExecutable(); + String executableTmp = getLiteralExecutable(); - if ( executable == null ) + if ( executableTmp == null ) { return args; } final String[] result = new String[args.length + 1]; - result[0] = executable; + result[0] = executableTmp; System.arraycopy( args, 0, result, 1, args.length ); return result; } @@ -568,7 +566,7 @@ public String toString() public int size() { - return getCommandline().length; + return getRawCommandline().length; } @Override @@ -668,7 +666,7 @@ public Process execute() { if ( workingDir == null ) { - process = Runtime.getRuntime().exec( getCommandline(), environment, workingDir ); + process = Runtime.getRuntime().exec( getRawCommandline(), environment, workingDir ); } else { diff --git a/src/test/java/org/codehaus/plexus/util/cli/CommandlineTest.java b/src/test/java/org/codehaus/plexus/util/cli/CommandlineTest.java index 28ec8297..65392bde 100644 --- a/src/test/java/org/codehaus/plexus/util/cli/CommandlineTest.java +++ b/src/test/java/org/codehaus/plexus/util/cli/CommandlineTest.java @@ -77,10 +77,15 @@ public void testExecuteBinaryOnPath() throws Exception { // Maven startup script on PATH is required for this test + String binary = "mvn"; + if ( Os.isFamily( Os.FAMILY_WINDOWS ) ) + { + binary += ".cmd"; + } Commandline cmd = new Commandline(); cmd.setWorkingDirectory( baseDir ); - cmd.setExecutable( "mvn" ); - assertEquals( "mvn", cmd.getShell().getOriginalExecutable() ); + cmd.setExecutable( binary ); + assertEquals( binary, cmd.getShell().getOriginalExecutable() ); cmd.createArg().setValue( "-version" ); Process process = cmd.execute(); String out = IOUtil.toString( process.getInputStream() ); @@ -94,11 +99,20 @@ public void testExecute() throws Exception { // allow it to detect the proper shell here. + String executable = "echo"; Commandline cmd = new Commandline(); cmd.setWorkingDirectory( baseDir ); - cmd.setExecutable( "echo" ); - assertEquals( "echo", cmd.getShell().getOriginalExecutable() ); - cmd.createArgument().setValue( "Hello" ); + if ( Os.isFamily( Os.FAMILY_WINDOWS ) ) + { + cmd.createArg().setValue( "Hello" ); + executable = "cmd"; + cmd.createArg().setValue("/X"); + cmd.createArg().setValue("/C"); + cmd.createArg().setValue("echo"); + } + cmd.setExecutable( executable ); + assertEquals( executable, cmd.getShell().getOriginalExecutable() ); + cmd.createArg().setValue( "Hello" ); Process process = cmd.execute(); assertEquals( "Hello", IOUtil.toString( process.getInputStream() ).trim() ); @@ -460,7 +474,10 @@ public void testDollarSignInArgumentPath() cmd.setExecutable( "cat" ); if ( Os.isFamily( Os.FAMILY_WINDOWS ) ) { - cmd.setExecutable( "dir" ); + cmd.setExecutable( "cmd" ); + cmd.createArg().setLine( "/X" ); + cmd.createArg().setLine( "/C" ); + cmd.createArg().setLine( "dir" ); } cmd.setWorkingDirectory( dir ); cmd.createArg().setLine( "test$1.txt" );