From 7ed45478384dc8eb5bdf3eae0dbefd033c93e55f Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 31 Aug 2026 16:59:03 +0200 Subject: fix(xtask): prevent incorrect CARGO_* env vars when executed command is cargo --- xtask/src/main.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'xtask/src/main.rs') diff --git a/xtask/src/main.rs b/xtask/src/main.rs index e955925..8bf25ae 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -15,10 +15,43 @@ fn main() return; }; - if let Err(err) = Command::new(program).args(args).status() { + if let Err(err) = Command::new(program) + .args(args) + .remove_envs( + // When a binary crate is run with 'cargo run', cargo sets environment + // variables with information about the crate, package & cargo manifest. + // These environment variables are unwanted when the program run here + // is cargo so they are removed. + // + // If cargo is the program run here and the environment variables are + // kept, cargo does not overwrite them, which can cause unnecessary + // rebuilds of dependencies + std::env::vars() + .map(|(key, _)| key) + .filter(|key| key.starts_with("CARGO_") && key != "CARGO_HOME"), + ) + .status() + { println!("Error: Failed to execute command: {err}"); } } else { println!("Error: Unknown task '{task}'"); } } + +trait CommandExt +{ + fn remove_envs(&mut self, keys: impl IntoIterator) -> &mut Self; +} + +impl CommandExt for Command +{ + fn remove_envs(&mut self, keys: impl IntoIterator) -> &mut Self + { + for env_key in keys { + self.env_remove(env_key); + } + + self + } +} -- cgit v1.2.3-18-g5258