소스 검색

[cli] don't expand argument after `--display`

closes #7748
Simon Krajewski 6 년 전
부모
커밋
fa3339af06
1개의 변경된 파일24개의 추가작업 그리고 21개의 파일을 삭제
  1. 24 21
      src/compiler/main.ml

+ 24 - 21
src/compiler/main.ml

@@ -87,25 +87,19 @@ let reserved_flags = [
 
 let delete_file f = try Sys.remove f with _ -> ()
 
-let expand_env is_arg ?(h=None) path =
-	try
-		if not is_arg then raise Not_found;
-		(* If we have an argument with line breaks, don't expand env. *)
-		ignore(String.index path '\n');
-		path
-	with Not_found ->
-		let r = Str.regexp "%\\([A-Za-z0-9_]+\\)%" in
-		Str.global_substitute r (fun s ->
-			let key = Str.matched_group 1 s in
-			try
-				Sys.getenv key
-			with Not_found -> try
-				match h with
-				| None -> raise Not_found
-				| Some h -> Hashtbl.find h key
-			with Not_found ->
-				"%" ^ key ^ "%"
-		) path
+let expand_env ?(h=None) path  =
+	let r = Str.regexp "%\\([A-Za-z0-9_]+\\)%" in
+	Str.global_substitute r (fun s ->
+		let key = Str.matched_group 1 s in
+		try
+			Sys.getenv key
+		with Not_found -> try
+			match h with
+			| None -> raise Not_found
+			| Some h -> Hashtbl.find h key
+		with Not_found ->
+			"%" ^ key ^ "%"
+	) path
 
 let add_libs com libs =
 	let call_haxelib() =
@@ -159,7 +153,7 @@ let run_command ctx cmd =
 	Hashtbl.add h "__file__" ctx.com.file;
 	Hashtbl.add h "__platform__" (platform_name ctx.com.platform);
 	let t = Timer.timer ["command"] in
-	let cmd = expand_env false ~h:(Some h) cmd in
+	let cmd = expand_env ~h:(Some h) cmd in
 	let len = String.length cmd in
 	if len > 3 && String.sub cmd 0 3 = "cd " then begin
 		Sys.chdir (String.sub cmd 3 (len - 3));
@@ -761,7 +755,16 @@ try
 	let process args =
 		let current = ref 0 in
 		(try
-			Arg.parse_argv ~current (Array.of_list ("" :: List.map (expand_env true) args)) all_args_spec args_callback "";
+			let rec loop acc args = match args with
+				| "--display" :: arg :: args ->
+					loop (arg :: "--display" :: acc) args
+				| arg :: args ->
+					loop (expand_env arg :: acc) args
+				| [] ->
+					List.rev acc
+			in
+			let args = loop [] args in
+			Arg.parse_argv ~current (Array.of_list ("" :: args)) all_args_spec args_callback "";
 			List.iter (fun fn -> fn()) !arg_delays
 		with
 		| Arg.Help _ ->