Browse Source

[java] support calling Sys.command/Process with raw cmd string

Andy Li 9 years ago
parent
commit
24aa974c7b
3 changed files with 36 additions and 16 deletions
  1. 1 1
      std/java/_std/Sys.hx
  2. 34 14
      std/java/_std/sys/io/Process.hx
  3. 1 1
      tests/sys/src/TestSys.hx

+ 1 - 1
std/java/_std/Sys.hx

@@ -112,7 +112,7 @@ using haxe.Int64;
 
 	public static function command( cmd : String, ?args : Array<String> ) : Int
 	{
-		var proc:Process = new Process(cmd, args == null ? [] : args);
+		var proc:Process = new Process(cmd, args);
 		var ret = proc.exitCode();
 		proc.close();
 

+ 34 - 14
std/java/_std/sys/io/Process.hx

@@ -38,20 +38,40 @@ class Process {
 
 	public function new( cmd : String, ?args : Array<String> ) : Void
 	{
-		var pargs = new NativeArray(args.length + 1);
-		switch (Sys.systemName()) {
-			case "Windows":
-				pargs[0] = StringTools.quoteWinArg(cmd, false);
-				for (i in 0...args.length)
-				{
-					pargs[i + 1] = StringTools.quoteWinArg(args[i], false);
-				}
-			case _:
-				pargs[0] = cmd;
-				for (i in 0...args.length)
-				{
-					pargs[i + 1] = args[i];
-				}
+		var sysName = Sys.systemName();
+		var pargs;
+		if (args == null) {
+			var cmdStr = cmd;
+			switch (sysName) {
+				case "Windows":
+					pargs = new NativeArray(2);
+					pargs[0] = cmd = switch (Sys.getEnv("COMSPEC")) {
+						case null: "cmd.exe";
+						case comspec: comspec;
+					}
+					pargs[1] = '/C "$cmdStr"';
+				case _:
+					pargs = new NativeArray(3);
+					pargs[0] = cmd = "/bin/sh";
+					pargs[1] = "-c";
+					pargs[2] = cmdStr;
+			}
+		} else {
+			pargs = new NativeArray(args.length + 1);
+			switch (sysName) {
+				case "Windows":
+					pargs[0] = StringTools.quoteWinArg(cmd, false);
+					for (i in 0...args.length)
+					{
+						pargs[i + 1] = StringTools.quoteWinArg(args[i], false);
+					}
+				case _:
+					pargs[0] = cmd;
+					for (i in 0...args.length)
+					{
+						pargs[i + 1] = args[i];
+					}
+			}
 		}
 
 		try

+ 1 - 1
tests/sys/src/TestSys.hx

@@ -29,7 +29,7 @@ class TestSys extends TestCommandBase {
 	}
 	#end
 
-	#if (neko || python || php)
+	#if (neko || python || php || java)
 	function testRawCommand() {
 		var bin = sys.FileSystem.absolutePath(ExitCode.bin);
 		var native = sys.FileSystem.absolutePath(ExitCode.getNative());