Forráskód Böngészése

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

Andy Li 9 éve
szülő
commit
93af4db28e
2 módosított fájl, 36 hozzáadás és 14 törlés
  1. 23 5
      std/cs/_std/Sys.hx
  2. 13 9
      std/cs/_std/sys/io/Process.hx

+ 23 - 5
std/cs/_std/Sys.hx

@@ -115,11 +115,29 @@ class Sys {
 
 	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 proc = Process.createNativeProcess(cmd, args);
+		proc.add_OutputDataReceived(new cs.system.diagnostics.DataReceivedEventHandler(
+			function(p, evtArgs) {
+				var data = evtArgs.Data;
+				if (data != null && data != "")
+					println(data);
+			}
+		));
+		var stderr = stderr();
+		proc.add_ErrorDataReceived(new cs.system.diagnostics.DataReceivedEventHandler(
+			function(p, evtArgs) {
+				var data = evtArgs.Data;
+				if (data != null && data != "")
+					stderr.writeString(data + "\n");
+			}
+		));
+		proc.Start();
+		proc.BeginOutputReadLine();
+		proc.BeginErrorReadLine();
+		proc.WaitForExit();
+		var exitCode = proc.ExitCode;
+		proc.Dispose();
+		return exitCode;
 	}
 
 	public static inline function exit( code : Int ) : Void

+ 13 - 9
std/cs/_std/sys/io/Process.hx

@@ -35,10 +35,19 @@ class Process {
 
 	private var native:NativeProcess;
 
-
 	public function new( cmd : String, ?args : Array<String> ) : Void
 	{
-		this.native = new NativeProcess();
+		this.native = createNativeProcess(cmd, args);
+		native.Start();
+
+		this.stdout = new cs.io.NativeInput(native.StandardOutput.BaseStream);
+		this.stderr = new cs.io.NativeInput(native.StandardError.BaseStream);
+		this.stdin = new cs.io.NativeOutput(native.StandardInput.BaseStream);
+	}
+
+	@:allow(Sys)
+	private static function createNativeProcess( cmd : String, ?args : Array<String> ) : NativeProcess {
+		var native = new NativeProcess();
 		native.StartInfo.CreateNoWindow = true;
 		native.StartInfo.RedirectStandardError = native.StartInfo.RedirectStandardInput = native.StartInfo.RedirectStandardOutput = true;
 		if (args != null) {
@@ -62,15 +71,10 @@ class Process {
 			}
 			native.StartInfo.UseShellExecute = false;
 		}
-
-		native.Start();
-
-		this.stdout = new cs.io.NativeInput(native.StandardOutput.BaseStream);
-		this.stderr = new cs.io.NativeInput(native.StandardError.BaseStream);
-		this.stdin = new cs.io.NativeOutput(native.StandardInput.BaseStream);
+		return native;
 	}
 
-	function buildArgumentsString(args:Array<String>):String {
+	private static function buildArgumentsString(args:Array<String>):String {
 		return switch (Sys.systemName()) {
 			case "Windows":
 				[