make unsetting env vars print as executable command

This commit is contained in:
Ralf Jung 2023-08-03 09:22:54 +02:00
parent f2b139f23d
commit 396cbe6639
2 changed files with 19 additions and 4 deletions

View File

@ -543,8 +543,8 @@ fn debug_print() {
);
let mut command_with_removed_env = Command::new("boring-name");
command_with_removed_env.env_remove("BAR");
assert_eq!(format!("{command_with_removed_env:?}"), r#"unset(BAR) "boring-name""#);
command_with_removed_env.env_remove("FOO").env_remove("BAR");
assert_eq!(format!("{command_with_removed_env:?}"), r#"unset BAR FOO && "boring-name""#);
assert_eq!(
format!("{command_with_removed_env:#?}"),
format!(
@ -557,6 +557,7 @@ fn debug_print() {
clear: false,
vars: {{
"BAR": None,
"FOO": None,
}},
}},
{PIDFD}}}"#

View File

@ -558,11 +558,25 @@ impl fmt::Debug for Command {
if let Some(ref cwd) = self.cwd {
write!(f, "cd {cwd:?} && ")?;
}
// Removed env vars need a separate command.
// We use a single `unset` command for all of them.
let mut any_removed = false;
for (key, value_opt) in self.get_envs() {
if value_opt.is_none() {
if !any_removed {
write!(f, "unset ")?;
any_removed = true;
}
write!(f, "{} ", key.to_string_lossy())?;
}
}
if any_removed {
write!(f, "&& ")?;
}
// Altered env vars can just be added in front of the program.
for (key, value_opt) in self.get_envs() {
if let Some(value) = value_opt {
write!(f, "{}={value:?} ", key.to_string_lossy())?;
} else {
write!(f, "unset({}) ", key.to_string_lossy())?;
}
}
if self.program != self.args[0] {