about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2023-08-03 12:07:42 +0200
committerRalf Jung <post@ralfj.de>2023-08-24 08:08:46 +0200
commit53a29e0e60b14486fbe06d0d68f311989d693816 (patch)
treeddeb1a1444e7354e06093e570e25ff3270e666e7 /library/std/src
parent3a28887623fe7c61f7f84759f5d53fbf11f6a55e (diff)
downloadrust-53a29e0e60b14486fbe06d0d68f311989d693816.tar.gz
rust-53a29e0e60b14486fbe06d0d68f311989d693816.zip
also print clearing the environment entirely
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/process/tests.rs23
-rw-r--r--library/std/src/sys/unix/process/process_common.rs29
-rw-r--r--library/std/src/sys_common/process.rs4
3 files changed, 44 insertions, 12 deletions
diff --git a/library/std/src/process/tests.rs b/library/std/src/process/tests.rs
index 0d5321c2eea..b50dea2e737 100644
--- a/library/std/src/process/tests.rs
+++ b/library/std/src/process/tests.rs
@@ -563,6 +563,29 @@ fn debug_print() {
 {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}}}"#
+        )
+    );
 }
 
 // See issue #91991
diff --git a/library/std/src/sys/unix/process/process_common.rs b/library/std/src/sys/unix/process/process_common.rs
index 3a02a6c20d9..23d9f3b78ee 100644
--- a/library/std/src/sys/unix/process/process_common.rs
+++ b/library/std/src/sys/unix/process/process_common.rs
@@ -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() {
diff --git a/library/std/src/sys_common/process.rs b/library/std/src/sys_common/process.rs
index 18883048dae..4d295cf0f09 100644
--- a/library/std/src/sys_common/process.rs
+++ b/library/std/src/sys_common/process.rs
@@ -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
     }