diff options
Diffstat (limited to 'xtask/src')
| -rw-r--r-- | xtask/src/main.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/xtask/src/main.rs b/xtask/src/main.rs new file mode 100644 index 0000000..8bf25ae --- /dev/null +++ b/xtask/src/main.rs @@ -0,0 +1,57 @@ +use std::process::Command; + +fn main() +{ + let mut args = std::env::args(); + + let Some(task) = args.nth(1) else { + println!("Error: No task is specified"); + return; + }; + + if task == "execute" { + let Some(program) = args.next() else { + println!("Error: No program is specified"); + return; + }; + + 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<Item = String>) -> &mut Self; +} + +impl CommandExt for Command +{ + fn remove_envs(&mut self, keys: impl IntoIterator<Item = String>) -> &mut Self + { + for env_key in keys { + self.env_remove(env_key); + } + + self + } +} |
