From ed791d9ced5713a4a583c8f6176a4cc919e46658 Mon Sep 17 00:00:00 2001 From: zhom <2717306+zhom@users.noreply.github.com> Date: Sun, 10 Aug 2025 05:34:57 +0400 Subject: [PATCH] test: retry with copied binaries --- tests/common/mod.rs | 53 ++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 3feb28a..9efa7a8 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -762,30 +762,47 @@ impl BundlerTestHelper { cmd.current_dir(&work_dir).output() }; - // If NotFound on Windows, retry via cmd /C + // If NotFound on Windows, retry using the copied executable directly with verbatim prefix; else cmd /C #[cfg(windows)] let output = match direct { Ok(o) => Ok(o), Err(e) if e.kind() == std::io::ErrorKind::NotFound => { - // Retry via cmd /C with proper quoting - fn quote(s: &str) -> String { - let mut out = String::from("\""); - out.push_str(&s.replace('"', "\\\"")); - out.push('"'); - out - } - let exe_str = exec_to_run.display().to_string(); - let mut cmdline = quote(&exe_str); - for a in args { - cmdline.push(' '); - cmdline.push_str("e(a)); - } - let mut c2 = Command::new("cmd"); - c2.args(["/C", &cmdline]).current_dir(&work_dir); + use std::ffi::OsString; + let abs = exec_to_run + .canonicalize() + .unwrap_or_else(|_| exec_to_run.clone()); + let mut verbatim: OsString = OsString::from(r"\\?\"); + verbatim.push(&abs); + let mut cmd = Command::new(&verbatim); + cmd.args(args).current_dir(&work_dir); for (key, value) in env_vars { - c2.env(key, value); + cmd.env(key, value); + } + match cmd.output() { + Ok(o2) => Ok(o2), + Err(e2) if e2.kind() == std::io::ErrorKind::NotFound => { + // Fallback to cmd /C with quoting + fn quote(s: &str) -> String { + let mut out = String::from("\""); + out.push_str(&s.replace('"', "\\\"")); + out.push('"'); + out + } + let exe_str = exec_to_run.display().to_string(); + let mut cmdline = quote(&exe_str); + for a in args { + cmdline.push(' '); + cmdline.push_str("e(a)); + } + let mut c2 = Command::new("cmd"); + c2.args(["/C", &cmdline]).current_dir(&work_dir); + for (key, value) in env_vars { + c2.env(key, value); + } + c2.output() + } + Err(e2) => Err(e2), } - c2.output() } Err(e) => Err(e), };