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, "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}}}"# {PIDFD}}}"#
) )
); );

View file

@ -558,20 +558,25 @@ impl fmt::Debug for Command {
if let Some(ref cwd) = self.cwd { if let Some(ref cwd) = self.cwd {
write!(f, "cd {cwd:?} && ")?; write!(f, "cd {cwd:?} && ")?;
} }
// Removed env vars need a separate command. if self.env.does_clear() {
// We use a single `unset` command for all of them. write!(f, "env -i ")?;
let mut any_removed = false; // Altered env vars will be printed next, that should exactly work as expected.
for (key, value_opt) in self.get_envs() { } else {
if value_opt.is_none() { // Removed env vars need a separate command.
if !any_removed { // We use a single `unset` command for all of them.
write!(f, "unset ")?; let mut any_removed = false;
any_removed = true; 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 {
if any_removed { write!(f, "&& ")?;
write!(f, "&& ")?; }
} }
// Altered env vars can just be added in front of the program. // Altered env vars can just be added in front of the program.
for (key, value_opt) in self.get_envs() { for (key, value_opt) in self.get_envs() {

View file

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