Expose force_quotes on Windows.
Quotes the arg and not quotes the arg have different effect on Windows when the program called are msys2/cygwin program. Refer to https://github.com/msys2/MSYS2-packages/issues/2176 Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
This commit is contained in:
parent
ee88f46bb5
commit
fa23ddf6e6
3 changed files with 49 additions and 10 deletions
|
@ -78,6 +78,7 @@ pub struct Command {
|
|||
stdin: Option<Stdio>,
|
||||
stdout: Option<Stdio>,
|
||||
stderr: Option<Stdio>,
|
||||
force_quotes_enabled: bool,
|
||||
}
|
||||
|
||||
pub enum Stdio {
|
||||
|
@ -109,6 +110,7 @@ impl Command {
|
|||
stdin: None,
|
||||
stdout: None,
|
||||
stderr: None,
|
||||
force_quotes_enabled: false,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -134,6 +136,10 @@ impl Command {
|
|||
self.flags = flags;
|
||||
}
|
||||
|
||||
pub fn force_quotes(&mut self, enabled: bool) {
|
||||
self.force_quotes_enabled = enabled;
|
||||
}
|
||||
|
||||
pub fn get_program(&self) -> &OsStr {
|
||||
&self.program
|
||||
}
|
||||
|
@ -181,7 +187,7 @@ impl Command {
|
|||
si.dwFlags = c::STARTF_USESTDHANDLES;
|
||||
|
||||
let program = program.as_ref().unwrap_or(&self.program);
|
||||
let mut cmd_str = make_command_line(program, &self.args)?;
|
||||
let mut cmd_str = make_command_line(program, &self.args, self.force_quotes_enabled)?;
|
||||
cmd_str.push(0); // add null terminator
|
||||
|
||||
// stolen from the libuv code.
|
||||
|
@ -467,7 +473,7 @@ fn zeroed_process_information() -> c::PROCESS_INFORMATION {
|
|||
|
||||
// Produces a wide string *without terminating null*; returns an error if
|
||||
// `prog` or any of the `args` contain a nul.
|
||||
fn make_command_line(prog: &OsStr, args: &[OsString]) -> io::Result<Vec<u16>> {
|
||||
fn make_command_line(prog: &OsStr, args: &[OsString], force_quotes: bool) -> io::Result<Vec<u16>> {
|
||||
// Encode the command and arguments in a command line string such
|
||||
// that the spawned process may recover them using CommandLineToArgvW.
|
||||
let mut cmd: Vec<u16> = Vec::new();
|
||||
|
@ -476,7 +482,7 @@ fn make_command_line(prog: &OsStr, args: &[OsString]) -> io::Result<Vec<u16>> {
|
|||
append_arg(&mut cmd, prog, true)?;
|
||||
for arg in args {
|
||||
cmd.push(' ' as u16);
|
||||
append_arg(&mut cmd, arg, false)?;
|
||||
append_arg(&mut cmd, arg, force_quotes)?;
|
||||
}
|
||||
return Ok(cmd);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue