Skip to content

Commit

Permalink
Allow runner params
Browse files Browse the repository at this point in the history
  • Loading branch information
RReverser committed May 12, 2017
1 parent 058e805 commit 851a284
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 18 deletions.
9 changes: 5 additions & 4 deletions src/cargo/ops/cargo_rustc/compilation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ pub struct Compilation<'cfg> {

config: &'cfg Config,

target_runner: LazyCell<Option<PathBuf>>,
target_runner: LazyCell<Option<(PathBuf, Vec<String>)>>,
}

impl<'cfg> Compilation<'cfg> {
Expand Down Expand Up @@ -94,18 +94,19 @@ impl<'cfg> Compilation<'cfg> {
self.fill_env(process(cmd), pkg, true)
}

fn target_runner(&self) -> CargoResult<&Option<PathBuf>> {
fn target_runner(&self) -> CargoResult<&Option<(PathBuf, Vec<String>)>> {
self.target_runner.get_or_try_init(|| {
let key = format!("target.{}.runner", self.target);
Ok(self.config.get_path(&key)?.map(|v| v.val))
Ok(self.config.get_path_and_args(&key)?.map(|v| v.val))
})
}

/// See `process`.
pub fn target_process<T: AsRef<OsStr>>(&self, cmd: T, pkg: &Package)
-> CargoResult<ProcessBuilder> {
let builder = if let &Some(ref runner) = self.target_runner()? {
let builder = if let &Some((ref runner, ref args)) = self.target_runner()? {
let mut builder = process(runner);
builder.args(args);
builder.arg(cmd);
builder
} else {
Expand Down
35 changes: 25 additions & 10 deletions src/cargo/util/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,25 +215,40 @@ impl Config {
}
}

fn string_to_path(&self, value: String, definition: &Definition) -> PathBuf {
let is_path = value.contains('/') ||
(cfg!(windows) && value.contains('\\'));
if is_path {
definition.root(self).join(value)
} else {
// A pathless name
PathBuf::from(value)
}
}

pub fn get_path(&self, key: &str) -> CargoResult<Option<Value<PathBuf>>> {
if let Some(val) = self.get_string(key)? {
let is_path = val.val.contains('/') ||
(cfg!(windows) && val.val.contains('\\'));
let path = if is_path {
val.definition.root(self).join(val.val)
} else {
// A pathless name
PathBuf::from(val.val)
};
Ok(Some(Value {
val: path,
definition: val.definition,
val: self.string_to_path(val.val, &val.definition),
definition: val.definition
}))
} else {
Ok(None)
}
}

pub fn get_path_and_args(&self, key: &str) -> CargoResult<Option<Value<(PathBuf, Vec<String>)>>> {
if let Some(mut val) = self.get_list_or_split_string(key)? {
if !val.val.is_empty() {
return Ok(Some(Value {
val: (self.string_to_path(val.val.remove(0), &val.definition), val.val),
definition: val.definition
}));
}
}
Ok(None)
}

pub fn get_list(&self, key: &str)
-> CargoResult<Option<Value<Vec<(String, PathBuf)>>>> {
match self.get(key)? {
Expand Down
8 changes: 4 additions & 4 deletions tests/tool-paths.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ fn custom_runner() {
.file("benches/bench.rs", "")
.file(".cargo/config", &format!(r#"
[target.{}]
runner = "nonexistent-runner"
runner = "nonexistent-runner -r"
"#, target));

foo.build();
Expand All @@ -149,15 +149,15 @@ fn custom_runner() {
execs().with_stderr_contains(&format!("\
[COMPILING] foo v0.0.1 ({url})
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
[RUNNING] `nonexistent-runner target[/]debug[/]foo[EXE] --param`
[RUNNING] `nonexistent-runner -r target[/]debug[/]foo[EXE] --param`
", url = foo.url())));

assert_that(foo.cargo("test").args(&["--test", "test", "--verbose", "--", "--param"]),
execs().with_stderr_contains(&format!("\
[COMPILING] foo v0.0.1 ({url})
[RUNNING] `rustc [..]`
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
[RUNNING] `nonexistent-runner [..][/]target[/]debug[/]deps[/]test-[..][EXE] --param`
[RUNNING] `nonexistent-runner -r [..][/]target[/]debug[/]deps[/]test-[..][EXE] --param`
", url = foo.url())));

assert_that(foo.cargo("bench").args(&["--bench", "bench", "--verbose", "--", "--param"]),
Expand All @@ -166,6 +166,6 @@ fn custom_runner() {
[RUNNING] `rustc [..]`
[RUNNING] `rustc [..]`
[FINISHED] release [optimized] target(s) in [..]
[RUNNING] `nonexistent-runner [..][/]target[/]release[/]deps[/]bench-[..][EXE] --param --bench`
[RUNNING] `nonexistent-runner -r [..][/]target[/]release[/]deps[/]bench-[..][EXE] --param --bench`
", url = foo.url())));
}

0 comments on commit 851a284

Please sign in to comment.