From 334378554bfc02a9d0a4b5d2fcd06cf5ec4d4fb1 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 1 Sep 2016 15:09:05 -0700 Subject: [PATCH] Add temporary `custom-implicit-stdlib-dependencies` key --- src/cargo/util/toml/implicit_deps.rs | 68 ++++++++++++++++++++++------ src/cargo/util/toml/mod.rs | 21 ++++++--- tests/stdlib-deps.rs | 34 ++++++++++++++ 3 files changed, 102 insertions(+), 21 deletions(-) diff --git a/src/cargo/util/toml/implicit_deps.rs b/src/cargo/util/toml/implicit_deps.rs index c1477c91624..f10a2dfe94e 100644 --- a/src/cargo/util/toml/implicit_deps.rs +++ b/src/cargo/util/toml/implicit_deps.rs @@ -1,11 +1,12 @@ use std::collections::HashMap; +use util::CargoResult; +use util::config::Config; use util::toml::{TomlDependency, DetailedTomlDependency}; - fn marshall(name_ver: I) -> HashMap - where I: Iterator, + where I: Iterator, S: Into { name_ver @@ -18,21 +19,58 @@ fn marshall(name_ver: I) .collect() } -pub fn primary() -> HashMap { - marshall(vec![ - ("core", "^1.0"), - ("std", "^1.0"), - ].into_iter()) +mod default { + use std::collections::HashMap; + use util::toml::TomlDependency; + use super::marshall; + + pub fn primary() -> HashMap { + marshall(vec![ + ("core", "^1.0"), + ("std", "^1.0"), + ].into_iter()) + } + + pub fn dev() -> HashMap { + let mut map = marshall(vec![ + ("test", "^1.0"), + ].into_iter()); + map.extend(self::primary().into_iter()); + map + } + + pub fn build() -> HashMap { + self::primary() + } } -pub fn dev() -> HashMap { - let mut map = marshall(vec![ - ("test", "^1.0"), - ].into_iter()); - map.extend(self::primary().into_iter()); - map +fn get_custom(sort: &'static str, config: &Config) + -> CargoResult>> +{ + let overrides = try!(config.get_list(&format!( + "custom-implicit-stdlib-dependencies.{}", + sort))); + + Ok(overrides.map(|os| marshall(os.val.into_iter().map(|o| (o.0, "^1.0"))))) } -pub fn build() -> HashMap { - self::primary() +pub fn primary(config: &Config) + -> CargoResult> +{ + Ok(try!(get_custom("dependencies", config)) + .unwrap_or_else(|| default::primary())) +} + +pub fn dev(config: &Config) + -> CargoResult> +{ + Ok(try!(get_custom("dev-dependencies", config)) + .unwrap_or_else(|| default::dev())) +} + +pub fn build(config: &Config) + -> CargoResult> +{ + Ok(try!(get_custom("build-dependencies", config)) + .unwrap_or_else(|| default::build())) } diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 633e91245e7..40e0967ce23 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -687,17 +687,26 @@ impl TomlManifest { // Add implicit deps cx.platform = None; + if try!(config.get_table("custom-implicit-stdlib-dependencies")).is_some() { + cx.warnings.push( + "the `custom-implicit-stdlib-dependencies` config key is unstable" + .to_string()); + } + if implicit_primary { - try!(process_deps(&mut cx, Some(&implicit_deps::primary()), - true, keep_stdlib_deps, None)); + try!(process_deps( + &mut cx, Some(&try!(implicit_deps::primary(config))), + true, keep_stdlib_deps, None)); } if !explicit_dev { - try!(process_deps(&mut cx, Some(&implicit_deps::dev()), - true, keep_stdlib_deps, Some(Kind::Development))); + try!(process_deps( + &mut cx, Some(&try!(implicit_deps::dev(config))), + true, keep_stdlib_deps, Some(Kind::Development))); } if !explicit_build { - try!(process_deps(&mut cx, Some(&implicit_deps::build()), - true, keep_stdlib_deps, Some(Kind::Build))); + try!(process_deps( + &mut cx, Some(&try!(implicit_deps::build(config))), + true, keep_stdlib_deps, Some(Kind::Build))); } replace = try!(self.replace(&mut cx)); diff --git a/tests/stdlib-deps.rs b/tests/stdlib-deps.rs index b1887b89a56..83217facb8a 100644 --- a/tests/stdlib-deps.rs +++ b/tests/stdlib-deps.rs @@ -314,3 +314,37 @@ Caused by: [..] ")); } + + +#[test] +fn override_implicit_deps() { + setup(); + Package::new("not-wanted", "0.0.1").local(true).publish(); + let foo = project("asdf") + .file("Cargo.toml", r#" + [package] + name = "local" + version = "0.0.0" + authors = [] + "#) + .file("src/lib.rs", "") + .file(".cargo/config", r#" + [custom-implicit-stdlib-dependencies] + dependencies = [ "foo" ] + dev-dependencies = [ ] + build-dependencies = [ ] + "#); + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_status(101) + .with_stderr_contains( + "[WARNING] the \"compiler source\" is unstable [..]") + .with_stderr_contains( + "[WARNING] the `keep-stdlib-dependencies` config key is unstable") + .with_stderr_contains( + "[WARNING] the `custom-implicit-stdlib-dependencies` config key is unstable") + .with_stderr_contains("\ +[ERROR] no matching package named `foo` found (required by `local`) +location searched: registry file://[..] +version required: ^1.0 +")); +}