Explorar el Código

attempt at entirely fixing sys command escaping

Nicolas Cannasse hace 11 años
padre
commit
41cf47f215
Se han modificado 3 ficheros con 8 adiciones y 7 borrados
  1. 6 5
      std/neko/_std/Sys.hx
  2. 1 1
      tests/RunCi.hx
  3. 1 1
      tests/sys/src/TestSys.hx

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

@@ -91,7 +91,7 @@
 		return new String(sys_string());
 	}
 
-	static function escapeArgument( arg : String ) : String {
+	static function escapeArgument( arg : String, windows : Bool ) : String {
 		var ok = true;
 		for( i in 0...arg.length )
 			switch( arg.charCodeAt(i) ) {
@@ -99,19 +99,20 @@
 				ok = false;
 			case 0, 13, 10: // [eof] [cr] [lf]
 				arg = arg.substr(0,i);
+				break;
 			}
 		if( ok )
 			return arg;
-		return '"'+arg.split('\\').join("\\\\").split('"').join('\\"')+'"';
+		return windows ? '"'+arg.split('"').join('"""').split("%").join('"%"')+'"' : "'"+arg.split("'").join("'\\''")+"'";
 	}
 
 	public static function command( cmd : String, ?args : Array<String> ) : Int {
+		var win = systemName() == "Windows";
+		cmd = escapeArgument(cmd, win);
 		if( args != null ) {
-			cmd = escapeArgument(cmd);
 			for( a in args )
-				cmd += " "+escapeArgument(a);
+				cmd += " "+escapeArgument(a, win);
 		}
-		if (systemName() == "Windows") cmd = '"$cmd"';
 		return sys_command(untyped cmd.__s);
 	}
 

+ 1 - 1
tests/RunCi.hx

@@ -395,7 +395,7 @@ class RunCi {
 		changeDirectory(unitDir);
 		Sys.putEnv("OCAMLRUNPARAM", "b");
 
-		var args = ["foo", "12", "a b c\\ &<>[\"]#{}|"];
+		var args = ["foo", "12", "a b %PATH% $HOME c\\ &<>[\"]#{}|%$"];
 
 		var tests:Array<TEST> = switch (ci) {
 			case null:

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

@@ -4,7 +4,7 @@ class TestSys extends haxe.unit.TestCase {
 		assertEquals(3, args.length);
 		assertEquals("foo", args[0]);
 		assertEquals("12", args[1]);
-		assertEquals("a b c\\ &<>[\"]#{}|", args[2]);		
+		assertEquals("a b  %PATH% $HOME c\\&<>[\"]#{}|%$", args[2]);		
 	}
 
 	function testEnv() {