Browse Source

[java] Sys.command should redirect stdout/stderr to parent

Andy Li 9 years ago
parent
commit
dc6fbe5553
2 changed files with 16 additions and 16 deletions
  1. 6 5
      std/java/_std/Sys.hx
  2. 10 11
      std/java/_std/sys/io/Process.hx

+ 6 - 5
std/java/_std/Sys.hx

@@ -112,11 +112,12 @@ using haxe.Int64;
 
 	public static function command( cmd : String, ?args : Array<String> ) : Int
 	{
-		var proc:Process = new Process(cmd, args);
-		var ret = proc.exitCode();
-		proc.close();
-
-		return ret;
+		var pb = Process.createProcessBuilder(cmd, args);
+		pb.redirectOutput(java.lang.ProcessBuilder.ProcessBuilder_Redirect.INHERIT);
+		pb.redirectError(java.lang.ProcessBuilder.ProcessBuilder_Redirect.INHERIT);
+		var proc = pb.start();
+		proc.waitFor();
+		return proc.exitValue();
 	}
 
 	public static function exit( code : Int ) : Void

+ 10 - 11
std/java/_std/sys/io/Process.hx

@@ -35,21 +35,21 @@ class Process {
 	public var stdin(default, null) : haxe.io.Output;
 
 	private var proc:java.lang.Process;
-
-	public function new( cmd : String, ?args : Array<String> ) : Void
-	{
+	@:allow(Sys)
+	private static function createProcessBuilder(cmd:String, ?args:Array<String>):java.lang.ProcessBuilder {
 		var sysName = Sys.systemName();
 		var pargs;
 		if (args == null) {
 			var cmdStr = cmd;
 			switch (sysName) {
 				case "Windows":
-					pargs = new NativeArray(2);
+					pargs = new NativeArray(3);
 					pargs[0] = cmd = switch (Sys.getEnv("COMSPEC")) {
 						case null: "cmd.exe";
 						case comspec: comspec;
 					}
-					pargs[1] = '/C "$cmdStr"';
+					pargs[1] = '/C';
+					pargs[2] = '"$cmdStr"';
 				case _:
 					pargs = new NativeArray(3);
 					pargs[0] = cmd = "/bin/sh";
@@ -74,13 +74,12 @@ class Process {
 			}
 		}
 
-		try
-		{
-			proc = new java.lang.ProcessBuilder(pargs).start();
-		}
-		catch (e:Dynamic) { throw e; } //wrapping typed exceptions
+		return new java.lang.ProcessBuilder(pargs);
+	}
 
-		var p = proc;
+	public function new( cmd : String, ?args : Array<String> ) : Void
+	{
+		var p = proc = createProcessBuilder(cmd, args).start();
 		stderr = new ProcessInput(p.getErrorStream());
 		stdout = new ProcessInput(p.getInputStream());
 		stdin = new java.io.NativeOutput(p.getOutputStream());