1
Fork 0

also print clearing the environment entirely

This commit is contained in:
Ralf Jung 2023-08-03 12:07:42 +02:00
parent 3a28887623
commit 53a29e0e60
3 changed files with 44 additions and 12 deletions

View file

@ -560,6 +560,29 @@ fn debug_print() {
"FOO": None,
}},
}},
{PIDFD}}}"#
)
);
let mut command_with_cleared_env = Command::new("boring-name");
command_with_cleared_env.env_clear().env("BAR", "val").env_remove("FOO");
assert_eq!(format!("{command_with_cleared_env:?}"), r#"env -i BAR="val" "boring-name""#);
assert_eq!(
format!("{command_with_cleared_env:#?}"),
format!(
r#"Command {{
program: "boring-name",
args: [
"boring-name",
],
env: CommandEnv {{
clear: true,
vars: {{
"BAR": Some(
"val",
),
}},
}},
{PIDFD}}}"#
)
);

View file

@ -558,20 +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;
if self.env.does_clear() {
write!(f, "env -i ")?;
// Altered env vars will be printed next, that should exactly work as expected.
} else {
// 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())?;
}
write!(f, "{} ", key.to_string_lossy())?;
}
}
if any_removed {
write!(f, "&& ")?;
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() {

View file

@ -80,6 +80,10 @@ impl CommandEnv {
self.vars.clear();
}
pub fn does_clear(&self) -> bool {
self.clear
}
pub fn have_changed_path(&self) -> bool {
self.saw_path || self.clear
}