From bfa853f8ed45d1908c98ec350f52c7a6790661da Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Wed, 2 Jul 2014 13:50:45 -0700 Subject: io::process::Command: add fine-grained env builder This commit changes the `io::process::Command` API to provide fine-grained control over the environment: * The `env` method now inserts/updates a key/value pair. * The `env_remove` method removes a key from the environment. * The old `env` method, which sets the entire environment in one shot, is renamed to `env_set_all`. It can be used in conjunction with the finer-grained methods. This renaming is a breaking change. To support these new methods, the internal `env` representation for `Command` has been changed to an optional `HashMap` holding owned `CString`s (to support non-utf8 data). The `HashMap` is only materialized if the environment is updated. The implementation does not try hard to avoid allocation, since the cost of launching a process will dwarf any allocation cost. This patch also adds `PartialOrd`, `Eq`, and `Hash` implementations for `CString`. [breaking-change] --- src/test/run-pass/backtrace.rs | 16 +++------------- src/test/run-pass/process-spawn-with-unicode-params.rs | 2 +- 2 files changed, 4 insertions(+), 14 deletions(-) (limited to 'src/test/run-pass') diff --git a/src/test/run-pass/backtrace.rs b/src/test/run-pass/backtrace.rs index 97862844030..c2a1c01b919 100644 --- a/src/test/run-pass/backtrace.rs +++ b/src/test/run-pass/backtrace.rs @@ -37,19 +37,8 @@ fn double() { } fn runtest(me: &str) { - let mut env = os::env().move_iter() - .map(|(ref k, ref v)| { - (k.to_string(), v.to_string()) - }).collect::>(); - match env.iter() - .position(|&(ref s, _)| "RUST_BACKTRACE" == s.as_slice()) { - Some(i) => { env.remove(i); } - None => {} - } - env.push(("RUST_BACKTRACE".to_string(), "1".to_string())); - // Make sure that the stack trace is printed - let mut p = Command::new(me).arg("fail").env(env.as_slice()).spawn().unwrap(); + let mut p = Command::new(me).arg("fail").env("RUST_BACKTRACE", "1").spawn().unwrap(); let out = p.wait_with_output().unwrap(); assert!(!out.status.success()); let s = str::from_utf8(out.error.as_slice()).unwrap(); @@ -73,7 +62,8 @@ fn runtest(me: &str) { "bad output3: {}", s); // Make sure a stack trace isn't printed too many times - let mut p = Command::new(me).arg("double-fail").env(env.as_slice()).spawn().unwrap(); + let mut p = Command::new(me).arg("double-fail") + .env("RUST_BACKTRACE", "1").spawn().unwrap(); let out = p.wait_with_output().unwrap(); assert!(!out.status.success()); let s = str::from_utf8(out.error.as_slice()).unwrap(); diff --git a/src/test/run-pass/process-spawn-with-unicode-params.rs b/src/test/run-pass/process-spawn-with-unicode-params.rs index 70839c18847..de86ca179b7 100644 --- a/src/test/run-pass/process-spawn-with-unicode-params.rs +++ b/src/test/run-pass/process-spawn-with-unicode-params.rs @@ -58,7 +58,7 @@ fn main() { let p = Command::new(&child_path) .arg(arg) .cwd(&cwd) - .env(my_env.append_one(env).as_slice()) + .env_set_all(my_env.append_one(env).as_slice()) .spawn().unwrap().wait_with_output().unwrap(); // display the output -- cgit 1.4.1-3-g733a5