auto merge of #15353 : aturon/rust/env-hashmap, r=alexcrichton
This commit adds `env_insert` and `env_remove` methods to the `Command` builder, easing updates to the environment variables for the child process. The existing method, `env`, is still available for overriding the entire environment in one shot (after which the `env_insert` and `env_remove` methods can be used to make further adjustments). 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`.
This commit is contained in:
commit
a672456c40
11 changed files with 137 additions and 72 deletions
|
|
@ -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::<Vec<(String,String)>>();
|
||||
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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue