From c0f854cfc665360f6edf2e83c643ea9ba0280526 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Mon, 3 Oct 2016 14:41:02 -0400 Subject: [PATCH 1/8] upgrade semver --- Cargo.lock | 24 ++++++++++++++---------- Cargo.toml | 2 +- src/cargo/core/dependency.rs | 19 ++++++++++++++++++- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c348bfa691..7a43b2b6208 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,7 +27,7 @@ dependencies = [ "psapi-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.1.73 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.4.1 (git+https://github.com/steveklabnik/semver?branch=deprecation)", "tar 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -359,11 +359,6 @@ dependencies = [ "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "nom" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "num" version = "0.1.34" @@ -527,10 +522,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.2.3" +version = "0.4.1" +source = "git+https://github.com/steveklabnik/semver?branch=deprecation#a3b67d654d7e00ea0a05a37851f49352d79834a3" +dependencies = [ + "semver-parser 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.1.73 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -680,7 +684,6 @@ dependencies = [ "checksum miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d1f4d337a01c32e1f2122510fed46393d53ca35a7f429cb0450abaedfa3ed54" "checksum miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d5bfc6782530ac8ace97af10a540054a37126b63b0702ddaaa243b73b5745b9a" "checksum net2 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "5edf9cb6be97212423aed9413dd4729d62b370b5e1c571750e882cebbbc1e3e2" -"checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" "checksum num 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "d2ee34a0338c16ae67afb55824aaf8852700eb0f77ccd977807ccb7606b295f6" "checksum num-bigint 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc450723a2fe91d332a29edd8660e099b937d29e1a3ebe914e0da3f77ac1ad3" "checksum num-complex 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "8aabbc079e1855ce8415141fee0ebebf171f56505373b3a966e2716ad7c0e555" @@ -699,7 +702,8 @@ dependencies = [ "checksum regex 0.1.73 (registry+https://github.com/rust-lang/crates.io-index)" = "56b7ee9f764ecf412c6e2fff779bca4b22980517ae335a21aeaf4e32625a5df2" "checksum regex-syntax 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "31040aad7470ad9d8c46302dcffba337bb4289ca5da2e3cd6e37b64109a85199" "checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" -"checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f" +"checksum semver 0.4.1 (git+https://github.com/steveklabnik/semver?branch=deprecation)" = "" +"checksum semver-parser 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e88e43a5a74dd2a11707f9c21dfd4a423c66bd871df813227bb0a3e78f3a1ae9" "checksum strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4d73a2c36a4d095ed1a6df5cbeac159863173447f7a82b3f4757426844ab825" "checksum tar 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "12e1b959f637c2e4c69dbdbf4d7dc609edbaada9b8c35d0c2fc9802d02383b65" "checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6" diff --git a/Cargo.toml b/Cargo.toml index 083a8654efb..563c865278d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ num_cpus = "1.0" psapi-sys = "0.1" regex = "0.1" rustc-serialize = "0.3" -semver = "0.2.3" +semver = { git = "https://github.com/steveklabnik/semver", branch = "deprecation" } tar = { version = "0.4", default-features = false } tempdir = "0.3" term = "0.4.4" diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index 48f4bd456d9..be8ff5d903f 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -3,6 +3,7 @@ use std::rc::Rc; use std::str::FromStr; use semver::VersionReq; +use semver::ReqParseError; use rustc_serialize::{Encoder, Encodable}; use core::{SourceId, Summary, PackageId}; @@ -91,7 +92,7 @@ impl DependencyInner { version: Option<&str>, source_id: &SourceId) -> CargoResult { let (specified_req, version_req) = match version { - Some(v) => (true, try!(VersionReq::parse(v))), + Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v))), None => (false, VersionReq::any()) }; @@ -103,6 +104,22 @@ impl DependencyInner { }) } + fn parse_with_deprecated(req: &str) -> Result { + match VersionReq::parse(req) { + Err(e) => { + match e { + ReqParseError::DeprecatedVersionRequirement(requirement) => { + // warn here + + Ok(requirement) + } + e => Err(e), + } + }, + Ok(v) => Ok(v), + } + } + pub fn new_override(name: &str, source_id: &SourceId) -> DependencyInner { DependencyInner { name: name.to_string(), From d80c9674cd330ffd1b83d74c743f7611d0010fb4 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Mon, 3 Oct 2016 16:40:57 -0400 Subject: [PATCH 2/8] thread a config throughout --- src/cargo/core/dependency.rs | 10 +++--- src/cargo/core/package.rs | 4 +-- src/cargo/core/registry.rs | 16 +++++----- src/cargo/core/resolver/mod.rs | 39 +++++++++++++---------- src/cargo/core/source.rs | 6 ++-- src/cargo/ops/cargo_clean.rs | 4 +-- src/cargo/ops/cargo_compile.rs | 6 ++-- src/cargo/ops/cargo_fetch.rs | 4 +-- src/cargo/ops/cargo_generate_lockfile.rs | 5 +-- src/cargo/ops/cargo_install.rs | 13 ++++---- src/cargo/ops/cargo_output_metadata.rs | 2 +- src/cargo/ops/cargo_rustc/context.rs | 29 +++++++++-------- src/cargo/ops/cargo_rustc/custom_build.rs | 2 +- src/cargo/ops/cargo_rustc/fingerprint.rs | 2 +- src/cargo/ops/cargo_rustc/job_queue.rs | 4 +-- src/cargo/ops/cargo_rustc/mod.rs | 6 ++-- src/cargo/ops/resolve.rs | 11 ++++--- src/cargo/sources/directory.rs | 4 +-- src/cargo/sources/git/source.rs | 8 ++--- src/cargo/sources/path.rs | 6 ++-- src/cargo/sources/registry/index.rs | 26 +++++++-------- src/cargo/sources/registry/mod.rs | 12 +++---- src/cargo/sources/replaced.rs | 10 +++--- src/cargo/util/toml.rs | 2 +- tests/resolve.rs | 15 ++++++--- 25 files changed, 133 insertions(+), 113 deletions(-) diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index be8ff5d903f..61167a8b4f5 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -7,7 +7,7 @@ use semver::ReqParseError; use rustc_serialize::{Encoder, Encodable}; use core::{SourceId, Summary, PackageId}; -use util::{CargoError, CargoResult, Cfg, CfgExpr, ChainError, human}; +use util::{CargoError, CargoResult, Cfg, CfgExpr, ChainError, human, Config}; /// Information about a dependency requested by a Cargo manifest. /// Cheap to copy. @@ -90,7 +90,8 @@ impl DependencyInner { /// Attempt to create a `Dependency` from an entry in the manifest. pub fn parse(name: &str, version: Option<&str>, - source_id: &SourceId) -> CargoResult { + source_id: &SourceId, + _config: &Config) -> CargoResult { let (specified_req, version_req) = match version { Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v))), None => (false, VersionReq::any()) @@ -233,8 +234,9 @@ impl Dependency { /// Attempt to create a `Dependency` from an entry in the manifest. pub fn parse(name: &str, version: Option<&str>, - source_id: &SourceId) -> CargoResult { - DependencyInner::parse(name, version, source_id).map(|di| { + source_id: &SourceId, + config: &Config) -> CargoResult { + DependencyInner::parse(name, version, source_id, config).map(|di| { di.into_dependency() }) } diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index da14b04fc33..0235b619285 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -156,7 +156,7 @@ impl<'cfg> PackageSet<'cfg> { Box::new(self.packages.iter().map(|&(ref p, _)| p)) } - pub fn get(&self, id: &PackageId) -> CargoResult<&Package> { + pub fn get(&self, id: &PackageId, config: &Config) -> CargoResult<&Package> { let slot = try!(self.packages.iter().find(|p| p.0 == *id).chain_error(|| { internal(format!("couldn't find `{}` in package set", id)) })); @@ -168,7 +168,7 @@ impl<'cfg> PackageSet<'cfg> { let source = try!(sources.get_mut(id.source_id()).chain_error(|| { internal(format!("couldn't find source for `{}`", id)) })); - let pkg = try!(source.download(id).chain_error(|| { + let pkg = try!(source.download(id, config).chain_error(|| { human("unable to get packages from source") })); assert!(slot.fill(pkg).is_ok()); diff --git a/src/cargo/core/registry.rs b/src/cargo/core/registry.rs index 79089ee4d7e..5aa11abfda7 100644 --- a/src/cargo/core/registry.rs +++ b/src/cargo/core/registry.rs @@ -10,7 +10,7 @@ use sources::config::SourceConfigMap; /// See also `core::Source`. pub trait Registry { /// Attempt to find the packages that match a dependency request. - fn query(&mut self, name: &Dependency) -> CargoResult>; + fn query(&mut self, name: &Dependency, config: &Config) -> CargoResult>; /// Returns whether or not this registry will return summaries with /// checksums listed. @@ -22,22 +22,22 @@ pub trait Registry { } impl Registry for Vec { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, _config: &Config) -> CargoResult> { Ok(self.iter().filter(|summary| dep.matches(*summary)) .cloned().collect()) } } impl Registry for Vec { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, _config: &Config) -> CargoResult> { Ok(self.iter().filter(|pkg| dep.matches(pkg.summary())) .map(|pkg| pkg.summary().clone()).collect()) } } impl<'a, T: ?Sized + Registry + 'a> Registry for Box { - fn query(&mut self, name: &Dependency) -> CargoResult> { - (**self).query(name) + fn query(&mut self, name: &Dependency, config: &Config) -> CargoResult> { + (**self).query(name, config) } } @@ -364,7 +364,7 @@ impl<'cfg> Registry for PackageRegistry<'cfg> { #[cfg(test)] pub mod test { use core::{Summary, Registry, Dependency}; - use util::{CargoResult}; + use util::{CargoResult, Config}; pub struct RegistryBuilder { summaries: Vec, @@ -405,13 +405,13 @@ pub mod test { } impl Registry for RegistryBuilder { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { debug!("querying; dep={:?}", dep); let overrides = self.query_overrides(dep); if overrides.is_empty() { - self.summaries.query(dep) + self.summaries.query(dep, config) } else { Ok(overrides) } diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index 7a9e953365a..ed57a1a9b0b 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -55,7 +55,7 @@ use semver; use core::{PackageId, Registry, SourceId, Summary, Dependency}; use core::PackageIdSpec; -use util::{CargoResult, Graph, human, CargoError}; +use util::{CargoResult, Graph, human, CargoError, Config}; use util::profile; use util::ChainError; use util::graph::{Nodes, Edges}; @@ -265,7 +265,8 @@ struct Context<'a> { /// Builds the list of all packages required to build the first argument. pub fn resolve(summaries: &[(Summary, Method)], replacements: &[(PackageIdSpec, Dependency)], - registry: &mut Registry) -> CargoResult { + registry: &mut Registry, + config: &Config) -> CargoResult { let cx = Context { resolve_graph: Graph::new(), resolve_features: HashMap::new(), @@ -274,7 +275,7 @@ pub fn resolve(summaries: &[(Summary, Method)], replacements: replacements, }; let _p = profile::start(format!("resolving")); - let cx = try!(activate_deps_loop(cx, registry, summaries)); + let cx = try!(activate_deps_loop(cx, registry, summaries, config)); let mut resolve = Resolve { graph: cx.resolve_graph, @@ -305,7 +306,8 @@ fn activate(cx: &mut Context, registry: &mut Registry, parent: Option<&Rc>, candidate: Candidate, - method: &Method) + method: &Method, + config: &Config) -> CargoResult> { if let Some(parent) = parent { cx.resolve_graph.link(parent.package_id().clone(), @@ -333,7 +335,7 @@ fn activate(cx: &mut Context, } }; - let deps = try!(cx.build_deps(registry, &candidate, method)); + let deps = try!(cx.build_deps(registry, &candidate, method, config)); Ok(Some(DepsFrame { parent: candidate, @@ -435,7 +437,8 @@ struct BacktrackFrame<'a> { /// dependency graph, cx.resolve is returned. fn activate_deps_loop<'a>(mut cx: Context<'a>, registry: &mut Registry, - summaries: &[(Summary, Method)]) + summaries: &[(Summary, Method)], + config: &Config) -> CargoResult> { // Note that a `BinaryHeap` is used for the remaining dependencies that need // activation. This heap is sorted such that the "largest value" is the most @@ -451,7 +454,7 @@ fn activate_deps_loop<'a>(mut cx: Context<'a>, let summary = Rc::new(summary.clone()); let candidate = Candidate { summary: summary, replace: None }; remaining_deps.extend(try!(activate(&mut cx, registry, None, candidate, - method))); + method, config))); } // Main resolution loop, this is the workhorse of the resolution algorithm. @@ -545,7 +548,8 @@ fn activate_deps_loop<'a>(mut cx: Context<'a>, None => return Err(activation_error(&cx, registry, &parent, &dep, &cx.prev_active(&dep), - &candidates)), + &candidates, + config)), Some(candidate) => candidate, } } @@ -559,7 +563,7 @@ fn activate_deps_loop<'a>(mut cx: Context<'a>, trace!("{}[{}]>{} trying {}", parent.name(), cur, dep.name(), candidate.summary.version()); remaining_deps.extend(try!(activate(&mut cx, registry, Some(&parent), - candidate, &method))); + candidate, &method, config))); } Ok(cx) @@ -595,7 +599,8 @@ fn activation_error(cx: &Context, parent: &Summary, dep: &Dependency, prev_active: &[Rc], - candidates: &[Candidate]) -> Box { + candidates: &[Candidate], + config: &Config) -> Box { if candidates.len() > 0 { let mut msg = format!("failed to select a version for `{}` \ (required by `{}`):\n\ @@ -648,7 +653,7 @@ fn activation_error(cx: &Context, let mut msg = msg; let all_req = semver::VersionReq::parse("*").unwrap(); let new_dep = dep.clone_inner().set_version_req(all_req).into_dependency(); - let mut candidates = match registry.query(&new_dep) { + let mut candidates = match registry.query(&new_dep, config) { Ok(candidates) => candidates, Err(e) => return e, }; @@ -816,7 +821,8 @@ impl<'a> Context<'a> { fn build_deps(&mut self, registry: &mut Registry, candidate: &Summary, - method: &Method) -> CargoResult> { + method: &Method, + config: &Config) -> CargoResult> { // First, figure out our set of dependencies based on the requsted set // of features. This also calculates what features we're going to enable // for our own dependencies. @@ -825,7 +831,7 @@ impl<'a> Context<'a> { // Next, transform all dependencies into a list of possible candidates // which can satisfy that dependency. let mut deps = try!(deps.into_iter().map(|(dep, features)| { - let mut candidates = try!(self.query(registry, &dep)); + let mut candidates = try!(self.query(registry, &dep, config)); // When we attempt versions for a package, we'll want to start at // the maximum version and work our way down. candidates.sort_by(|a, b| { @@ -851,8 +857,9 @@ impl<'a> Context<'a> { /// return. fn query(&self, registry: &mut Registry, - dep: &Dependency) -> CargoResult> { - let summaries = try!(registry.query(dep)); + dep: &Dependency, + config: &Config) -> CargoResult> { + let summaries = try!(registry.query(dep, config)); summaries.into_iter().map(Rc::new).map(|summary| { // get around lack of non-lexical lifetimes let summary2 = summary.clone(); @@ -865,7 +872,7 @@ impl<'a> Context<'a> { Some(replacement) => replacement, }; - let mut summaries = try!(registry.query(dep)).into_iter(); + let mut summaries = try!(registry.query(dep, config)).into_iter(); let s = try!(summaries.next().chain_error(|| { human(format!("no matching package for override `{}` found\n\ location searched: {}\n\ diff --git a/src/cargo/core/source.rs b/src/cargo/core/source.rs index 4a46c19294d..b09d57ef93e 100644 --- a/src/cargo/core/source.rs +++ b/src/cargo/core/source.rs @@ -27,7 +27,7 @@ pub trait Source: Registry { /// The download method fetches the full package for each name and /// version specified. - fn download(&mut self, package: &PackageId) -> CargoResult; + fn download(&mut self, package: &PackageId, config: &Config) -> CargoResult; /// Generates a unique string which represents the fingerprint of the /// current state of the source. @@ -57,8 +57,8 @@ impl<'a, T: Source + ?Sized + 'a> Source for Box { (**self).update() } - fn download(&mut self, id: &PackageId) -> CargoResult { - (**self).download(id) + fn download(&mut self, id: &PackageId, config: &Config) -> CargoResult { + (**self).download(id, config) } fn fingerprint(&self, pkg: &Package) -> CargoResult { diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index e19b37f116f..6c50a90dc6b 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -29,7 +29,7 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { } let mut registry = try!(PackageRegistry::new(opts.config)); - let resolve = try!(ops::resolve_ws(&mut registry, ws)); + let resolve = try!(ops::resolve_ws(&mut registry, ws, opts.config)); let packages = ops::get_resolved_packages(&resolve, registry); let profiles = try!(ws.current()).manifest().profiles(); @@ -47,7 +47,7 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { for spec in opts.spec { // Translate the spec to a Package let pkgid = try!(resolve.query(spec)); - let pkg = try!(packages.get(&pkgid)); + let pkg = try!(packages.get(&pkgid, ws.config())); // Generate all relevant `Unit` targets for this package for target in pkg.targets() { diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 0767e9e467a..c8b50cd93b9 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -118,7 +118,7 @@ pub fn resolve_dependencies<'a>(ws: &Workspace<'a>, // First, resolve the root_package's *listed* dependencies, as well as // downloading and updating all remotes and such. - let resolve = try!(ops::resolve_ws(&mut registry, ws)); + let resolve = try!(ops::resolve_ws(&mut registry, ws, ws.config())); // Second, resolve with precisely what we're doing. Filter out // transitive dependencies if necessary, specify features, handle @@ -143,7 +143,7 @@ pub fn resolve_dependencies<'a>(ws: &Workspace<'a>, let resolved_with_overrides = try!(ops::resolve_with_previous(&mut registry, ws, method, Some(&resolve), None, - &specs)); + &specs, ws.config())); let packages = ops::get_resolved_packages(&resolved_with_overrides, registry); @@ -190,7 +190,7 @@ pub fn compile_ws<'a>(ws: &Workspace<'a>, }; let to_builds = try!(pkgids.iter().map(|id| { - packages.get(id) + packages.get(id, config) }).collect::>>()); let mut general_targets = Vec::new(); diff --git a/src/cargo/ops/cargo_fetch.rs b/src/cargo/ops/cargo_fetch.rs index a0144c8f472..77634b9c83f 100644 --- a/src/cargo/ops/cargo_fetch.rs +++ b/src/cargo/ops/cargo_fetch.rs @@ -6,10 +6,10 @@ use util::CargoResult; /// Executes `cargo fetch`. pub fn fetch<'a>(ws: &Workspace<'a>) -> CargoResult<(Resolve, PackageSet<'a>)> { let mut registry = try!(PackageRegistry::new(ws.config())); - let resolve = try!(ops::resolve_ws(&mut registry, ws)); + let resolve = try!(ops::resolve_ws(&mut registry, ws, ws.config())); let packages = get_resolved_packages(&resolve, registry); for id in resolve.iter() { - try!(packages.get(id)); + try!(packages.get(id, ws.config())); } Ok((resolve, packages)) } diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 25e2204ba9e..7758cc63c4d 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -19,7 +19,7 @@ pub fn generate_lockfile(ws: &Workspace) -> CargoResult<()> { let mut registry = try!(PackageRegistry::new(ws.config())); let resolve = try!(ops::resolve_with_previous(&mut registry, ws, Method::Everything, - None, None, &[])); + None, None, &[], ws.config())); try!(ops::write_pkg_lockfile(ws, &resolve)); Ok(()) } @@ -79,7 +79,8 @@ pub fn update_lockfile(ws: &Workspace, opts: &UpdateOptions) Method::Everything, Some(&previous_resolve), Some(&to_avoid), - &[])); + &[], + ws.config())); // Summarize what is changing for the user. let print_change = |status: &str, msg: String| { diff --git a/src/cargo/ops/cargo_install.rs b/src/cargo/ops/cargo_install.rs index 616c7b35186..91d44a4d4ff 100644 --- a/src/cargo/ops/cargo_install.rs +++ b/src/cargo/ops/cargo_install.rs @@ -57,7 +57,7 @@ pub fn install(root: Option<&str>, let map = try!(SourceConfigMap::new(config)); let (pkg, source) = if source_id.is_git() { try!(select_pkg(GitSource::new(source_id, config), source_id, - krate, vers, &mut |git| git.read_packages())) + krate, vers, config, &mut |git| git.read_packages())) } else if source_id.is_path() { let path = source_id.url().to_file_path().ok() .expect("path sources must have a valid path"); @@ -68,11 +68,11 @@ pub fn install(root: Option<&str>, specify an alternate source", path.display())) })); try!(select_pkg(PathSource::new(&path, source_id, config), - source_id, krate, vers, + source_id, krate, vers, config, &mut |path| path.read_packages())) } else { try!(select_pkg(try!(map.load(source_id)), - source_id, krate, vers, + source_id, krate, vers, config, &mut |_| Err(human("must specify a crate to install from \ crates.io, or use --path or --git to \ specify alternate source")))) @@ -251,6 +251,7 @@ fn select_pkg<'a, T>(mut source: T, source_id: &SourceId, name: Option<&str>, vers: Option<&str>, + config: &Config, list_all: &mut FnMut(&mut T) -> CargoResult>) -> CargoResult<(Package, Box)> where T: Source + 'a @@ -258,11 +259,11 @@ fn select_pkg<'a, T>(mut source: T, try!(source.update()); match name { Some(name) => { - let dep = try!(Dependency::parse(name, vers, source_id)); - let deps = try!(source.query(&dep)); + let dep = try!(Dependency::parse(name, vers, source_id, config)); + let deps = try!(source.query(&dep, config)); match deps.iter().map(|p| p.package_id()).max() { Some(pkgid) => { - let pkg = try!(source.download(pkgid)); + let pkg = try!(source.download(pkgid, config)); Ok((pkg, Box::new(source))) } None => { diff --git a/src/cargo/ops/cargo_output_metadata.rs b/src/cargo/ops/cargo_output_metadata.rs index 131b93825db..488fa9853a1 100644 --- a/src/cargo/ops/cargo_output_metadata.rs +++ b/src/cargo/ops/cargo_output_metadata.rs @@ -52,7 +52,7 @@ fn metadata_full(ws: &Workspace, let (packages, resolve) = deps; let packages = try!(packages.package_ids() - .map(|i| packages.get(i).map(|p| p.clone())) + .map(|i| packages.get(i, ws.config()).map(|p| p.clone())) .collect()); Ok(ExportInfo { diff --git a/src/cargo/ops/cargo_rustc/context.rs b/src/cargo/ops/cargo_rustc/context.rs index 7cbd2149fe4..5ff2a6c8fee 100644 --- a/src/cargo/ops/cargo_rustc/context.rs +++ b/src/cargo/ops/cargo_rustc/context.rs @@ -156,7 +156,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } })); } - for dep in try!(self.dep_targets(&unit)) { + for dep in try!(self.dep_targets(&unit, self.config)) { try!(self.visit_crate_type(&dep, crate_types)); } Ok(()) @@ -251,7 +251,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> { for unit in units { try!(self.walk_used_in_plugin_map(unit, unit.target.for_host(), - &mut visited)); + &mut visited, + self.config)); } Ok(()) } @@ -259,7 +260,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> { fn walk_used_in_plugin_map(&mut self, unit: &Unit<'a>, is_plugin: bool, - visited: &mut HashSet<(Unit<'a>, bool)>) + visited: &mut HashSet<(Unit<'a>, bool)>, + config: &Config) -> CargoResult<()> { if !visited.insert((*unit, is_plugin)) { return Ok(()) @@ -267,10 +269,11 @@ impl<'a, 'cfg> Context<'a, 'cfg> { if is_plugin { self.used_in_plugin.insert(*unit); } - for unit in try!(self.dep_targets(unit)) { + for unit in try!(self.dep_targets(unit, config)) { try!(self.walk_used_in_plugin_map(&unit, is_plugin || unit.target.for_host(), - visited)); + visited, + config)); } Ok(()) } @@ -443,11 +446,11 @@ impl<'a, 'cfg> Context<'a, 'cfg> { /// For a package, return all targets which are registered as dependencies /// for that package. - pub fn dep_targets(&self, unit: &Unit<'a>) -> CargoResult>> { + pub fn dep_targets(&self, unit: &Unit<'a>, config: &Config) -> CargoResult>> { if unit.profile.run_custom_build { return self.dep_run_custom_build(unit) } else if unit.profile.doc { - return self.doc_deps(unit); + return self.doc_deps(unit, config); } let id = unit.pkg.package_id(); @@ -490,7 +493,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { true }) }).filter_map(|id| { - match self.get_package(id) { + match self.get_package(id, config) { Ok(pkg) => { pkg.targets().iter().find(|t| t.is_lib()).map(|t| { Ok(Unit { @@ -564,7 +567,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { profile: &self.profiles.dev, ..*unit }; - let deps = try!(self.dep_targets(&tmp)); + let deps = try!(self.dep_targets(&tmp, self.config)); Ok(deps.iter().filter_map(|unit| { if !unit.target.linkable() || unit.pkg.manifest().links().is_none() { return None @@ -578,7 +581,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } /// Returns the dependencies necessary to document a package - fn doc_deps(&self, unit: &Unit<'a>) -> CargoResult>> { + fn doc_deps(&self, unit: &Unit<'a>, config: &Config) -> CargoResult>> { let deps = self.resolve.deps(unit.pkg.package_id()).filter(|dep| { unit.pkg.dependencies().iter().filter(|d| { d.name() == dep.name() @@ -590,7 +593,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } }) }).map(|dep| { - self.get_package(dep) + self.get_package(dep, config) }); // To document a library, we depend on dependencies actually being @@ -673,8 +676,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } /// Gets a package for the given package id. - pub fn get_package(&self, id: &PackageId) -> CargoResult<&'a Package> { - self.packages.get(id) + pub fn get_package(&self, id: &PackageId, config: &Config) -> CargoResult<&'a Package> { + self.packages.get(id, config) } /// Get the user-specified linker for a particular host or target diff --git a/src/cargo/ops/cargo_rustc/custom_build.rs b/src/cargo/ops/cargo_rustc/custom_build.rs index 5a15e85a853..c78d067d618 100644 --- a/src/cargo/ops/cargo_rustc/custom_build.rs +++ b/src/cargo/ops/cargo_rustc/custom_build.rs @@ -413,7 +413,7 @@ pub fn build_map<'b, 'cfg>(cx: &mut Context<'b, 'cfg>, if !unit.target.is_custom_build() && unit.pkg.has_custom_build() { add_to_link(&mut ret, unit.pkg.package_id(), unit.kind); } - for unit in try!(cx.dep_targets(unit)).iter() { + for unit in try!(cx.dep_targets(unit, cx.config)).iter() { let dep_scripts = try!(build(out, cx, unit)); if unit.target.for_host() { diff --git a/src/cargo/ops/cargo_rustc/fingerprint.rs b/src/cargo/ops/cargo_rustc/fingerprint.rs index 702deb5f863..a24d7ad2b6d 100644 --- a/src/cargo/ops/cargo_rustc/fingerprint.rs +++ b/src/cargo/ops/cargo_rustc/fingerprint.rs @@ -345,7 +345,7 @@ fn calculate<'a, 'cfg>(cx: &mut Context<'a, 'cfg>, unit: &Unit<'a>) // elsewhere. Also skip fingerprints of binaries because they don't actually // induce a recompile, they're just dependencies in the sense that they need // to be built. - let deps = try!(cx.dep_targets(unit)); + let deps = try!(cx.dep_targets(unit, cx.config)); let deps = try!(deps.iter().filter(|u| { !u.target.is_custom_build() && !u.target.is_bin() }).map(|unit| { diff --git a/src/cargo/ops/cargo_rustc/job_queue.rs b/src/cargo/ops/cargo_rustc/job_queue.rs index 53bad6b786c..db359a7345a 100644 --- a/src/cargo/ops/cargo_rustc/job_queue.rs +++ b/src/cargo/ops/cargo_rustc/job_queue.rs @@ -323,12 +323,12 @@ impl<'a> Key<'a> { fn dependencies<'cfg>(&self, cx: &Context<'a, 'cfg>) -> CargoResult>> { let unit = Unit { - pkg: try!(cx.get_package(self.pkg)), + pkg: try!(cx.get_package(self.pkg, cx.config)), target: self.target, profile: self.profile, kind: self.kind, }; - let targets = try!(cx.dep_targets(&unit)); + let targets = try!(cx.dep_targets(&unit, cx.config)); Ok(targets.iter().filter_map(|unit| { // Binaries aren't actually needed to *compile* tests, just to run // them, so we don't include this dependency edge in the job graph. diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 280b6c05df5..660f517ca8f 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -130,7 +130,7 @@ pub fn compile_targets<'a, 'cfg: 'a>(ws: &Workspace<'cfg>, if !unit.target.is_lib() { continue } // Include immediate lib deps as well - for unit in try!(cx.dep_targets(unit)).iter() { + for unit in try!(cx.dep_targets(unit, cx.config)).iter() { let pkgid = unit.pkg.package_id(); if !unit.target.is_lib() { continue } if unit.profile.doc { continue } @@ -197,7 +197,7 @@ fn compile<'a, 'cfg: 'a>(cx: &mut Context<'a, 'cfg>, drop(p); // Be sure to compile all dependencies of this target as well. - for unit in try!(cx.dep_targets(unit)).iter() { + for unit in try!(cx.dep_targets(unit, cx.config)).iter() { try!(compile(cx, jobs, unit)); } Ok(()) @@ -652,7 +652,7 @@ fn build_deps_args(cmd: &mut CommandPrototype, cx: &Context, unit: &Unit) cmd.env("OUT_DIR", &layout.build_out(unit.pkg)); } - for unit in try!(cx.dep_targets(unit)).iter() { + for unit in try!(cx.dep_targets(unit, cx.config)).iter() { if unit.target.linkable() && !unit.profile.doc { try!(link_to(cmd, cx, unit)); } diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index af912b0dfba..5f4c1617acc 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -4,19 +4,19 @@ use core::{PackageId, PackageIdSpec, SourceId, Workspace}; use core::registry::PackageRegistry; use core::resolver::{self, Resolve, Method}; use ops; -use util::CargoResult; +use util::{CargoResult, Config}; /// Resolve all dependencies for the specified `package` using the previous /// lockfile as a guide if present. /// /// This function will also write the result of resolution as a new /// lockfile. -pub fn resolve_ws(registry: &mut PackageRegistry, ws: &Workspace) +pub fn resolve_ws(registry: &mut PackageRegistry, ws: &Workspace, config: &Config) -> CargoResult { let prev = try!(ops::load_pkg_lockfile(ws)); let resolve = try!(resolve_with_previous(registry, ws, Method::Everything, - prev.as_ref(), None, &[])); + prev.as_ref(), None, &[], config)); // Avoid writing a lockfile if we are `cargo install`ing a non local package. if ws.current_opt().map(|pkg| pkg.package_id().source_id().is_path()).unwrap_or(true) { @@ -39,7 +39,8 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry, method: Method, previous: Option<&'a Resolve>, to_avoid: Option<&HashSet<&'a PackageId>>, - specs: &[PackageIdSpec]) + specs: &[PackageIdSpec], + config: &Config) -> CargoResult { // Here we place an artificial limitation that all non-registry sources // cannot be locked at more than one revision. This means that if a git @@ -127,7 +128,7 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry, None => root_replace.to_vec(), }; - let mut resolved = try!(resolver::resolve(&summaries, &replace, registry)); + let mut resolved = try!(resolver::resolve(&summaries, &replace, registry, config)); if let Some(previous) = previous { try!(resolved.merge_from(previous)); } diff --git a/src/cargo/sources/directory.rs b/src/cargo/sources/directory.rs index 84a9501a03b..650a5092413 100644 --- a/src/cargo/sources/directory.rs +++ b/src/cargo/sources/directory.rs @@ -44,7 +44,7 @@ impl<'cfg> Debug for DirectorySource<'cfg> { } impl<'cfg> Registry for DirectorySource<'cfg> { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, _config: &Config) -> CargoResult> { let packages = self.packages.values().map(|p| &p.0); let matches = packages.filter(|pkg| dep.matches(pkg.summary())); let summaries = matches.map(|pkg| pkg.summary().clone()); @@ -98,7 +98,7 @@ impl<'cfg> Source for DirectorySource<'cfg> { Ok(()) } - fn download(&mut self, id: &PackageId) -> CargoResult { + fn download(&mut self, id: &PackageId, _config: &Config) -> CargoResult { self.packages.get(id).map(|p| &p.0).cloned().chain_error(|| { human(format!("failed to find package with id: {}", id)) }) diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index eeffcb05b72..87e424810a9 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -114,10 +114,10 @@ impl<'cfg> Debug for GitSource<'cfg> { } impl<'cfg> Registry for GitSource<'cfg> { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { let src = self.path_source.as_mut() .expect("BUG: update() must be called before query()"); - src.query(dep) + src.query(dep, config) } } @@ -175,12 +175,12 @@ impl<'cfg> Source for GitSource<'cfg> { self.path_source.as_mut().unwrap().update() } - fn download(&mut self, id: &PackageId) -> CargoResult { + fn download(&mut self, id: &PackageId, config: &Config) -> CargoResult { trace!("getting packages for package id `{}` from `{:?}`", id, self.remote); self.path_source.as_mut() .expect("BUG: update() must be called before get()") - .download(id) + .download(id, config) } fn fingerprint(&self, _pkg: &Package) -> CargoResult { diff --git a/src/cargo/sources/path.rs b/src/cargo/sources/path.rs index 052d01c7dab..cee7f6cf3f1 100644 --- a/src/cargo/sources/path.rs +++ b/src/cargo/sources/path.rs @@ -310,8 +310,8 @@ impl<'cfg> Debug for PathSource<'cfg> { } impl<'cfg> Registry for PathSource<'cfg> { - fn query(&mut self, dep: &Dependency) -> CargoResult> { - self.packages.query(dep) + fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { + self.packages.query(dep, config) } } @@ -326,7 +326,7 @@ impl<'cfg> Source for PathSource<'cfg> { Ok(()) } - fn download(&mut self, id: &PackageId) -> CargoResult { + fn download(&mut self, id: &PackageId, _config: &Config) -> CargoResult { trace!("getting packages; id={}", id); let pkg = self.packages.iter().find(|pkg| pkg.package_id() == id); diff --git a/src/cargo/sources/registry/index.rs b/src/cargo/sources/registry/index.rs index 5f27b4b2a4f..9d50b4f75bb 100644 --- a/src/cargo/sources/registry/index.rs +++ b/src/cargo/sources/registry/index.rs @@ -35,13 +35,13 @@ impl<'cfg> RegistryIndex<'cfg> { } /// Return the hash listed for a specified PackageId. - pub fn hash(&mut self, pkg: &PackageId) -> CargoResult { + pub fn hash(&mut self, pkg: &PackageId, config: &Config) -> CargoResult { let key = (pkg.name().to_string(), pkg.version().to_string()); if let Some(s) = self.hashes.get(&key) { return Ok(s.clone()) } // Ok, we're missing the key, so parse the index file to load it. - try!(self.summaries(pkg.name())); + try!(self.summaries(pkg.name(), config)); self.hashes.get(&key).chain_error(|| { internal(format!("no hash listed for {}", pkg)) }).map(|s| s.clone()) @@ -51,11 +51,11 @@ impl<'cfg> RegistryIndex<'cfg> { /// /// Returns a list of pairs of (summary, yanked) for the package name /// specified. - pub fn summaries(&mut self, name: &str) -> CargoResult<&Vec<(Summary, bool)>> { + pub fn summaries(&mut self, name: &str, config: &Config) -> CargoResult<&Vec<(Summary, bool)>> { if self.cache.contains_key(name) { return Ok(self.cache.get(name).unwrap()); } - let summaries = try!(self.load_summaries(name)); + let summaries = try!(self.load_summaries(name, config)); let summaries = summaries.into_iter().filter(|summary| { summary.0.package_id().name() == name }).collect(); @@ -63,7 +63,7 @@ impl<'cfg> RegistryIndex<'cfg> { Ok(self.cache.get(name).unwrap()) } - fn load_summaries(&mut self, name: &str) -> CargoResult> { + fn load_summaries(&mut self, name: &str, config: &Config) -> CargoResult> { let (path, _lock) = if self.locked { let lock = self.path.open_ro(Path::new(INDEX_LOCK), self.config, @@ -97,7 +97,7 @@ impl<'cfg> RegistryIndex<'cfg> { try!(f.read_to_string(&mut contents)); let ret: CargoResult>; ret = contents.lines().filter(|l| l.trim().len() > 0) - .map(|l| self.parse_registry_package(l)) + .map(|l| self.parse_registry_package(l, config)) .collect(); ret.chain_error(|| { internal(format!("failed to parse registry's information \ @@ -112,14 +112,14 @@ impl<'cfg> RegistryIndex<'cfg> { /// package. /// /// The returned boolean is whether or not the summary has been yanked. - fn parse_registry_package(&mut self, line: &str) + fn parse_registry_package(&mut self, line: &str, config: &Config) -> CargoResult<(Summary, bool)> { let RegistryPackage { name, vers, cksum, deps, features, yanked } = try!(json::decode::(line)); let pkgid = try!(PackageId::new(&name, &vers, &self.source_id)); let deps: CargoResult> = deps.into_iter().map(|dep| { - self.parse_registry_dependency(dep) + self.parse_registry_dependency(dep, config) }).collect(); let deps = try!(deps); let summary = try!(Summary::new(pkgid, deps, features)); @@ -129,14 +129,14 @@ impl<'cfg> RegistryIndex<'cfg> { } /// Converts an encoded dependency in the registry to a cargo dependency - fn parse_registry_dependency(&self, dep: RegistryDependency) + fn parse_registry_dependency(&self, dep: RegistryDependency, config: &Config) -> CargoResult { let RegistryDependency { name, req, features, optional, default_features, target, kind } = dep; let dep = try!(DependencyInner::parse(&name, Some(&req), - &self.source_id)); + &self.source_id, config)); let kind = match kind.as_ref().map(|s| &s[..]).unwrap_or("") { "dev" => Kind::Development, "build" => Kind::Build, @@ -165,9 +165,9 @@ impl<'cfg> RegistryIndex<'cfg> { } impl<'cfg> Registry for RegistryIndex<'cfg> { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { let mut summaries = { - let summaries = try!(self.summaries(dep.name())); + let summaries = try!(self.summaries(dep.name(), config)); summaries.iter().filter(|&&(_, yanked)| { dep.source_id().precise().is_some() || !yanked }).map(|s| s.0.clone()).collect::>() @@ -187,7 +187,7 @@ impl<'cfg> Registry for RegistryIndex<'cfg> { _ => true, } }); - summaries.query(dep) + summaries.query(dep, config) } fn supports_checksums(&self) -> bool { diff --git a/src/cargo/sources/registry/mod.rs b/src/cargo/sources/registry/mod.rs index 3a1babafb04..2b959b163f2 100644 --- a/src/cargo/sources/registry/mod.rs +++ b/src/cargo/sources/registry/mod.rs @@ -317,18 +317,18 @@ impl<'cfg> RegistrySource<'cfg> { } impl<'cfg> Registry for RegistrySource<'cfg> { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { // If this is a precise dependency, then it came from a lockfile and in // theory the registry is known to contain this version. If, however, we // come back with no summaries, then our registry may need to be // updated, so we fall back to performing a lazy update. if dep.source_id().precise().is_some() && !self.updated { - if try!(self.index.query(dep)).is_empty() { + if try!(self.index.query(dep, config)).is_empty() { try!(self.do_update()); } } - self.index.query(dep) + self.index.query(dep, config) } fn supports_checksums(&self) -> bool { @@ -351,15 +351,15 @@ impl<'cfg> Source for RegistrySource<'cfg> { Ok(()) } - fn download(&mut self, package: &PackageId) -> CargoResult { - let hash = try!(self.index.hash(package)); + fn download(&mut self, package: &PackageId, config: &Config) -> CargoResult { + let hash = try!(self.index.hash(package, config)); let path = try!(self.ops.download(package, &hash)); let path = try!(self.unpack_package(package, &path).chain_error(|| { internal(format!("failed to unpack package `{}`", package)) })); let mut src = PathSource::new(&path, &self.source_id, self.config); try!(src.update()); - src.download(package) + src.download(package, config) } fn fingerprint(&self, pkg: &Package) -> CargoResult { diff --git a/src/cargo/sources/replaced.rs b/src/cargo/sources/replaced.rs index 7fb95bdf6c8..ad94d101cb8 100644 --- a/src/cargo/sources/replaced.rs +++ b/src/cargo/sources/replaced.rs @@ -1,5 +1,5 @@ use core::{Source, Registry, PackageId, Package, Dependency, Summary, SourceId}; -use util::{CargoResult, ChainError, human}; +use util::{CargoResult, ChainError, human, Config}; pub struct ReplacedSource<'cfg> { to_replace: SourceId, @@ -20,9 +20,9 @@ impl<'cfg> ReplacedSource<'cfg> { } impl<'cfg> Registry for ReplacedSource<'cfg> { - fn query(&mut self, dep: &Dependency) -> CargoResult> { + fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { let dep = dep.clone().map_source(&self.to_replace, &self.replace_with); - let ret = try!(self.inner.query(&dep).chain_error(|| { + let ret = try!(self.inner.query(&dep, config).chain_error(|| { human(format!("failed to query replaced source `{}`", self.to_replace)) })); @@ -40,9 +40,9 @@ impl<'cfg> Source for ReplacedSource<'cfg> { }) } - fn download(&mut self, id: &PackageId) -> CargoResult { + fn download(&mut self, id: &PackageId, config: &Config) -> CargoResult { let id = id.with_source_id(&self.replace_with); - let pkg = try!(self.inner.download(&id).chain_error(|| { + let pkg = try!(self.inner.download(&id, config).chain_error(|| { human(format!("failed to download replaced source `{}`", self.to_replace)) })); diff --git a/src/cargo/util/toml.rs b/src/cargo/util/toml.rs index a051a2836b3..06a169bed58 100644 --- a/src/cargo/util/toml.rs +++ b/src/cargo/util/toml.rs @@ -883,7 +883,7 @@ impl TomlDependency { }; let version = details.version.as_ref().map(|v| &v[..]); - let mut dep = try!(DependencyInner::parse(name, version, &new_source_id)); + let mut dep = try!(DependencyInner::parse(name, version, &new_source_id, cx.config)); dep = dep.set_features(details.features.unwrap_or(Vec::new())) .set_default_features(details.default_features.unwrap_or(true)) .set_optional(details.optional.unwrap_or(false)) diff --git a/tests/resolve.rs b/tests/resolve.rs index 9e30c002860..8ed295e91a8 100644 --- a/tests/resolve.rs +++ b/tests/resolve.rs @@ -10,17 +10,19 @@ use hamcrest::{assert_that, equal_to, contains}; use cargo::core::source::{SourceId, GitReference}; use cargo::core::dependency::Kind::{self, Development}; use cargo::core::{Dependency, PackageId, Summary, Registry}; -use cargo::util::{CargoResult, ToUrl}; +use cargo::util::{CargoResult, ToUrl, Config}; use cargo::core::resolver::{self, Method}; fn resolve(pkg: PackageId, deps: Vec, registry: &mut R) -> CargoResult> { + let config = Config::default().unwrap(); let summary = Summary::new(pkg.clone(), deps, HashMap::new()).unwrap(); let method = Method::Everything; Ok(try!(resolver::resolve(&[(summary, method)], &[], - registry)).iter().map(|p| { + registry, + &config)).iter().map(|p| { p.clone() }).collect()) } @@ -33,7 +35,8 @@ impl ToDep for &'static str { fn to_dep(self) -> Dependency { let url = "http://example.com".to_url().unwrap(); let source_id = SourceId::for_registry(&url); - Dependency::parse(self, Some("1.0.0"), &source_id).unwrap() + let config = Config::default().unwrap(); + Dependency::parse(self, Some("1.0.0"), &source_id, &config).unwrap() } } @@ -101,14 +104,16 @@ fn dep(name: &str) -> Dependency { dep_req(name, "1.0.0") } fn dep_req(name: &str, req: &str) -> Dependency { let url = "http://example.com".to_url().unwrap(); let source_id = SourceId::for_registry(&url); - Dependency::parse(name, Some(req), &source_id).unwrap() + let config = Config::default().unwrap(); + Dependency::parse(name, Some(req), &source_id, &config).unwrap() } fn dep_loc(name: &str, location: &str) -> Dependency { let url = location.to_url().unwrap(); let master = GitReference::Branch("master".to_string()); let source_id = SourceId::for_git(&url, master); - Dependency::parse(name, Some("1.0.0"), &source_id).unwrap() + let config = Config::default().unwrap(); + Dependency::parse(name, Some("1.0.0"), &source_id, &config).unwrap() } fn dep_kind(name: &str, kind: Kind) -> Dependency { dep(name).clone_inner().set_kind(kind).into_dependency() From a29c60a1cfdd0c22dee11591e027ae1969f791bd Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Mon, 3 Oct 2016 16:55:24 -0400 Subject: [PATCH 3/8] Print the warning --- src/cargo/core/dependency.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index 61167a8b4f5..bd909b309d9 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -91,9 +91,9 @@ impl DependencyInner { pub fn parse(name: &str, version: Option<&str>, source_id: &SourceId, - _config: &Config) -> CargoResult { + config: &Config) -> CargoResult { let (specified_req, version_req) = match version { - Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v))), + Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v, config))), None => (false, VersionReq::any()) }; @@ -105,16 +105,19 @@ impl DependencyInner { }) } - fn parse_with_deprecated(req: &str) -> Result { + fn parse_with_deprecated(req: &str, config: &Config) -> CargoResult { match VersionReq::parse(req) { Err(e) => { match e { ReqParseError::DeprecatedVersionRequirement(requirement) => { - // warn here + let msg = format!("One of your version requirements ({}) is invalid. \ +Previous versions of Cargo accepted this malformed requirement, but it is being deprecated. Please \ +use {} instead.", req, requirement); + try!(config.shell().warn(&msg)); Ok(requirement) } - e => Err(e), + e => Err(From::from(e)), } }, Ok(v) => Ok(v), From 6704634f5f166d96663e4e0577e032312600c210 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Mon, 3 Oct 2016 17:21:46 -0400 Subject: [PATCH 4/8] simplify slightly --- src/cargo/ops/cargo_clean.rs | 2 +- src/cargo/ops/cargo_compile.rs | 4 ++-- src/cargo/ops/cargo_fetch.rs | 2 +- src/cargo/ops/cargo_generate_lockfile.rs | 5 ++--- src/cargo/ops/resolve.rs | 11 +++++------ 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 6c50a90dc6b..c5a32e1d634 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -29,7 +29,7 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { } let mut registry = try!(PackageRegistry::new(opts.config)); - let resolve = try!(ops::resolve_ws(&mut registry, ws, opts.config)); + let resolve = try!(ops::resolve_ws(&mut registry, ws)); let packages = ops::get_resolved_packages(&resolve, registry); let profiles = try!(ws.current()).manifest().profiles(); diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index c8b50cd93b9..44ea51afdd5 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -118,7 +118,7 @@ pub fn resolve_dependencies<'a>(ws: &Workspace<'a>, // First, resolve the root_package's *listed* dependencies, as well as // downloading and updating all remotes and such. - let resolve = try!(ops::resolve_ws(&mut registry, ws, ws.config())); + let resolve = try!(ops::resolve_ws(&mut registry, ws)); // Second, resolve with precisely what we're doing. Filter out // transitive dependencies if necessary, specify features, handle @@ -143,7 +143,7 @@ pub fn resolve_dependencies<'a>(ws: &Workspace<'a>, let resolved_with_overrides = try!(ops::resolve_with_previous(&mut registry, ws, method, Some(&resolve), None, - &specs, ws.config())); + &specs)); let packages = ops::get_resolved_packages(&resolved_with_overrides, registry); diff --git a/src/cargo/ops/cargo_fetch.rs b/src/cargo/ops/cargo_fetch.rs index 77634b9c83f..43cd5c109a9 100644 --- a/src/cargo/ops/cargo_fetch.rs +++ b/src/cargo/ops/cargo_fetch.rs @@ -6,7 +6,7 @@ use util::CargoResult; /// Executes `cargo fetch`. pub fn fetch<'a>(ws: &Workspace<'a>) -> CargoResult<(Resolve, PackageSet<'a>)> { let mut registry = try!(PackageRegistry::new(ws.config())); - let resolve = try!(ops::resolve_ws(&mut registry, ws, ws.config())); + let resolve = try!(ops::resolve_ws(&mut registry, ws)); let packages = get_resolved_packages(&resolve, registry); for id in resolve.iter() { try!(packages.get(id, ws.config())); diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 7758cc63c4d..25e2204ba9e 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -19,7 +19,7 @@ pub fn generate_lockfile(ws: &Workspace) -> CargoResult<()> { let mut registry = try!(PackageRegistry::new(ws.config())); let resolve = try!(ops::resolve_with_previous(&mut registry, ws, Method::Everything, - None, None, &[], ws.config())); + None, None, &[])); try!(ops::write_pkg_lockfile(ws, &resolve)); Ok(()) } @@ -79,8 +79,7 @@ pub fn update_lockfile(ws: &Workspace, opts: &UpdateOptions) Method::Everything, Some(&previous_resolve), Some(&to_avoid), - &[], - ws.config())); + &[])); // Summarize what is changing for the user. let print_change = |status: &str, msg: String| { diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 5f4c1617acc..6b114dd61cc 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -4,19 +4,19 @@ use core::{PackageId, PackageIdSpec, SourceId, Workspace}; use core::registry::PackageRegistry; use core::resolver::{self, Resolve, Method}; use ops; -use util::{CargoResult, Config}; +use util::CargoResult; /// Resolve all dependencies for the specified `package` using the previous /// lockfile as a guide if present. /// /// This function will also write the result of resolution as a new /// lockfile. -pub fn resolve_ws(registry: &mut PackageRegistry, ws: &Workspace, config: &Config) +pub fn resolve_ws(registry: &mut PackageRegistry, ws: &Workspace) -> CargoResult { let prev = try!(ops::load_pkg_lockfile(ws)); let resolve = try!(resolve_with_previous(registry, ws, Method::Everything, - prev.as_ref(), None, &[], config)); + prev.as_ref(), None, &[])); // Avoid writing a lockfile if we are `cargo install`ing a non local package. if ws.current_opt().map(|pkg| pkg.package_id().source_id().is_path()).unwrap_or(true) { @@ -39,8 +39,7 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry, method: Method, previous: Option<&'a Resolve>, to_avoid: Option<&HashSet<&'a PackageId>>, - specs: &[PackageIdSpec], - config: &Config) + specs: &[PackageIdSpec]) -> CargoResult { // Here we place an artificial limitation that all non-registry sources // cannot be locked at more than one revision. This means that if a git @@ -128,7 +127,7 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry, None => root_replace.to_vec(), }; - let mut resolved = try!(resolver::resolve(&summaries, &replace, registry, config)); + let mut resolved = try!(resolver::resolve(&summaries, &replace, registry, ws.config())); if let Some(previous) = previous { try!(resolved.merge_from(previous)); } From 4c1f84b205a043d8533742761e6466962ce399b9 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 7 Oct 2016 11:07:37 -0700 Subject: [PATCH 5/8] Revert addition of a number of Config params --- src/cargo/core/package.rs | 4 +-- src/cargo/core/registry.rs | 10 +++--- src/cargo/core/resolver/mod.rs | 39 ++++++++++------------- src/cargo/core/source.rs | 6 ++-- src/cargo/ops/cargo_clean.rs | 2 +- src/cargo/ops/cargo_compile.rs | 2 +- src/cargo/ops/cargo_fetch.rs | 2 +- src/cargo/ops/cargo_install.rs | 4 +-- src/cargo/ops/cargo_output_metadata.rs | 2 +- src/cargo/ops/cargo_rustc/context.rs | 29 ++++++++--------- src/cargo/ops/cargo_rustc/custom_build.rs | 2 +- src/cargo/ops/cargo_rustc/fingerprint.rs | 2 +- src/cargo/ops/cargo_rustc/job_queue.rs | 4 +-- src/cargo/ops/cargo_rustc/mod.rs | 6 ++-- src/cargo/ops/resolve.rs | 2 +- src/cargo/sources/directory.rs | 4 +-- src/cargo/sources/git/source.rs | 8 ++--- src/cargo/sources/path.rs | 6 ++-- src/cargo/sources/registry/index.rs | 27 ++++++++-------- src/cargo/sources/registry/mod.rs | 12 +++---- src/cargo/sources/replaced.rs | 10 +++--- tests/resolve.rs | 4 +-- 22 files changed, 88 insertions(+), 99 deletions(-) diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index 0235b619285..da14b04fc33 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -156,7 +156,7 @@ impl<'cfg> PackageSet<'cfg> { Box::new(self.packages.iter().map(|&(ref p, _)| p)) } - pub fn get(&self, id: &PackageId, config: &Config) -> CargoResult<&Package> { + pub fn get(&self, id: &PackageId) -> CargoResult<&Package> { let slot = try!(self.packages.iter().find(|p| p.0 == *id).chain_error(|| { internal(format!("couldn't find `{}` in package set", id)) })); @@ -168,7 +168,7 @@ impl<'cfg> PackageSet<'cfg> { let source = try!(sources.get_mut(id.source_id()).chain_error(|| { internal(format!("couldn't find source for `{}`", id)) })); - let pkg = try!(source.download(id, config).chain_error(|| { + let pkg = try!(source.download(id).chain_error(|| { human("unable to get packages from source") })); assert!(slot.fill(pkg).is_ok()); diff --git a/src/cargo/core/registry.rs b/src/cargo/core/registry.rs index 5aa11abfda7..bea9e6a1041 100644 --- a/src/cargo/core/registry.rs +++ b/src/cargo/core/registry.rs @@ -10,7 +10,7 @@ use sources::config::SourceConfigMap; /// See also `core::Source`. pub trait Registry { /// Attempt to find the packages that match a dependency request. - fn query(&mut self, name: &Dependency, config: &Config) -> CargoResult>; + fn query(&mut self, name: &Dependency) -> CargoResult>; /// Returns whether or not this registry will return summaries with /// checksums listed. @@ -22,22 +22,22 @@ pub trait Registry { } impl Registry for Vec { - fn query(&mut self, dep: &Dependency, _config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { Ok(self.iter().filter(|summary| dep.matches(*summary)) .cloned().collect()) } } impl Registry for Vec { - fn query(&mut self, dep: &Dependency, _config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { Ok(self.iter().filter(|pkg| dep.matches(pkg.summary())) .map(|pkg| pkg.summary().clone()).collect()) } } impl<'a, T: ?Sized + Registry + 'a> Registry for Box { - fn query(&mut self, name: &Dependency, config: &Config) -> CargoResult> { - (**self).query(name, config) + fn query(&mut self, name: &Dependency) -> CargoResult> { + (**self).query(name) } } diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index ed57a1a9b0b..7a9e953365a 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -55,7 +55,7 @@ use semver; use core::{PackageId, Registry, SourceId, Summary, Dependency}; use core::PackageIdSpec; -use util::{CargoResult, Graph, human, CargoError, Config}; +use util::{CargoResult, Graph, human, CargoError}; use util::profile; use util::ChainError; use util::graph::{Nodes, Edges}; @@ -265,8 +265,7 @@ struct Context<'a> { /// Builds the list of all packages required to build the first argument. pub fn resolve(summaries: &[(Summary, Method)], replacements: &[(PackageIdSpec, Dependency)], - registry: &mut Registry, - config: &Config) -> CargoResult { + registry: &mut Registry) -> CargoResult { let cx = Context { resolve_graph: Graph::new(), resolve_features: HashMap::new(), @@ -275,7 +274,7 @@ pub fn resolve(summaries: &[(Summary, Method)], replacements: replacements, }; let _p = profile::start(format!("resolving")); - let cx = try!(activate_deps_loop(cx, registry, summaries, config)); + let cx = try!(activate_deps_loop(cx, registry, summaries)); let mut resolve = Resolve { graph: cx.resolve_graph, @@ -306,8 +305,7 @@ fn activate(cx: &mut Context, registry: &mut Registry, parent: Option<&Rc>, candidate: Candidate, - method: &Method, - config: &Config) + method: &Method) -> CargoResult> { if let Some(parent) = parent { cx.resolve_graph.link(parent.package_id().clone(), @@ -335,7 +333,7 @@ fn activate(cx: &mut Context, } }; - let deps = try!(cx.build_deps(registry, &candidate, method, config)); + let deps = try!(cx.build_deps(registry, &candidate, method)); Ok(Some(DepsFrame { parent: candidate, @@ -437,8 +435,7 @@ struct BacktrackFrame<'a> { /// dependency graph, cx.resolve is returned. fn activate_deps_loop<'a>(mut cx: Context<'a>, registry: &mut Registry, - summaries: &[(Summary, Method)], - config: &Config) + summaries: &[(Summary, Method)]) -> CargoResult> { // Note that a `BinaryHeap` is used for the remaining dependencies that need // activation. This heap is sorted such that the "largest value" is the most @@ -454,7 +451,7 @@ fn activate_deps_loop<'a>(mut cx: Context<'a>, let summary = Rc::new(summary.clone()); let candidate = Candidate { summary: summary, replace: None }; remaining_deps.extend(try!(activate(&mut cx, registry, None, candidate, - method, config))); + method))); } // Main resolution loop, this is the workhorse of the resolution algorithm. @@ -548,8 +545,7 @@ fn activate_deps_loop<'a>(mut cx: Context<'a>, None => return Err(activation_error(&cx, registry, &parent, &dep, &cx.prev_active(&dep), - &candidates, - config)), + &candidates)), Some(candidate) => candidate, } } @@ -563,7 +559,7 @@ fn activate_deps_loop<'a>(mut cx: Context<'a>, trace!("{}[{}]>{} trying {}", parent.name(), cur, dep.name(), candidate.summary.version()); remaining_deps.extend(try!(activate(&mut cx, registry, Some(&parent), - candidate, &method, config))); + candidate, &method))); } Ok(cx) @@ -599,8 +595,7 @@ fn activation_error(cx: &Context, parent: &Summary, dep: &Dependency, prev_active: &[Rc], - candidates: &[Candidate], - config: &Config) -> Box { + candidates: &[Candidate]) -> Box { if candidates.len() > 0 { let mut msg = format!("failed to select a version for `{}` \ (required by `{}`):\n\ @@ -653,7 +648,7 @@ fn activation_error(cx: &Context, let mut msg = msg; let all_req = semver::VersionReq::parse("*").unwrap(); let new_dep = dep.clone_inner().set_version_req(all_req).into_dependency(); - let mut candidates = match registry.query(&new_dep, config) { + let mut candidates = match registry.query(&new_dep) { Ok(candidates) => candidates, Err(e) => return e, }; @@ -821,8 +816,7 @@ impl<'a> Context<'a> { fn build_deps(&mut self, registry: &mut Registry, candidate: &Summary, - method: &Method, - config: &Config) -> CargoResult> { + method: &Method) -> CargoResult> { // First, figure out our set of dependencies based on the requsted set // of features. This also calculates what features we're going to enable // for our own dependencies. @@ -831,7 +825,7 @@ impl<'a> Context<'a> { // Next, transform all dependencies into a list of possible candidates // which can satisfy that dependency. let mut deps = try!(deps.into_iter().map(|(dep, features)| { - let mut candidates = try!(self.query(registry, &dep, config)); + let mut candidates = try!(self.query(registry, &dep)); // When we attempt versions for a package, we'll want to start at // the maximum version and work our way down. candidates.sort_by(|a, b| { @@ -857,9 +851,8 @@ impl<'a> Context<'a> { /// return. fn query(&self, registry: &mut Registry, - dep: &Dependency, - config: &Config) -> CargoResult> { - let summaries = try!(registry.query(dep, config)); + dep: &Dependency) -> CargoResult> { + let summaries = try!(registry.query(dep)); summaries.into_iter().map(Rc::new).map(|summary| { // get around lack of non-lexical lifetimes let summary2 = summary.clone(); @@ -872,7 +865,7 @@ impl<'a> Context<'a> { Some(replacement) => replacement, }; - let mut summaries = try!(registry.query(dep, config)).into_iter(); + let mut summaries = try!(registry.query(dep)).into_iter(); let s = try!(summaries.next().chain_error(|| { human(format!("no matching package for override `{}` found\n\ location searched: {}\n\ diff --git a/src/cargo/core/source.rs b/src/cargo/core/source.rs index b09d57ef93e..4a46c19294d 100644 --- a/src/cargo/core/source.rs +++ b/src/cargo/core/source.rs @@ -27,7 +27,7 @@ pub trait Source: Registry { /// The download method fetches the full package for each name and /// version specified. - fn download(&mut self, package: &PackageId, config: &Config) -> CargoResult; + fn download(&mut self, package: &PackageId) -> CargoResult; /// Generates a unique string which represents the fingerprint of the /// current state of the source. @@ -57,8 +57,8 @@ impl<'a, T: Source + ?Sized + 'a> Source for Box { (**self).update() } - fn download(&mut self, id: &PackageId, config: &Config) -> CargoResult { - (**self).download(id, config) + fn download(&mut self, id: &PackageId) -> CargoResult { + (**self).download(id) } fn fingerprint(&self, pkg: &Package) -> CargoResult { diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index c5a32e1d634..e19b37f116f 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -47,7 +47,7 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { for spec in opts.spec { // Translate the spec to a Package let pkgid = try!(resolve.query(spec)); - let pkg = try!(packages.get(&pkgid, ws.config())); + let pkg = try!(packages.get(&pkgid)); // Generate all relevant `Unit` targets for this package for target in pkg.targets() { diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 44ea51afdd5..0767e9e467a 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -190,7 +190,7 @@ pub fn compile_ws<'a>(ws: &Workspace<'a>, }; let to_builds = try!(pkgids.iter().map(|id| { - packages.get(id, config) + packages.get(id) }).collect::>>()); let mut general_targets = Vec::new(); diff --git a/src/cargo/ops/cargo_fetch.rs b/src/cargo/ops/cargo_fetch.rs index 43cd5c109a9..a0144c8f472 100644 --- a/src/cargo/ops/cargo_fetch.rs +++ b/src/cargo/ops/cargo_fetch.rs @@ -9,7 +9,7 @@ pub fn fetch<'a>(ws: &Workspace<'a>) -> CargoResult<(Resolve, PackageSet<'a>)> { let resolve = try!(ops::resolve_ws(&mut registry, ws)); let packages = get_resolved_packages(&resolve, registry); for id in resolve.iter() { - try!(packages.get(id, ws.config())); + try!(packages.get(id)); } Ok((resolve, packages)) } diff --git a/src/cargo/ops/cargo_install.rs b/src/cargo/ops/cargo_install.rs index 91d44a4d4ff..59d16e27286 100644 --- a/src/cargo/ops/cargo_install.rs +++ b/src/cargo/ops/cargo_install.rs @@ -260,10 +260,10 @@ fn select_pkg<'a, T>(mut source: T, match name { Some(name) => { let dep = try!(Dependency::parse(name, vers, source_id, config)); - let deps = try!(source.query(&dep, config)); + let deps = try!(source.query(&dep)); match deps.iter().map(|p| p.package_id()).max() { Some(pkgid) => { - let pkg = try!(source.download(pkgid, config)); + let pkg = try!(source.download(pkgid)); Ok((pkg, Box::new(source))) } None => { diff --git a/src/cargo/ops/cargo_output_metadata.rs b/src/cargo/ops/cargo_output_metadata.rs index 488fa9853a1..131b93825db 100644 --- a/src/cargo/ops/cargo_output_metadata.rs +++ b/src/cargo/ops/cargo_output_metadata.rs @@ -52,7 +52,7 @@ fn metadata_full(ws: &Workspace, let (packages, resolve) = deps; let packages = try!(packages.package_ids() - .map(|i| packages.get(i, ws.config()).map(|p| p.clone())) + .map(|i| packages.get(i).map(|p| p.clone())) .collect()); Ok(ExportInfo { diff --git a/src/cargo/ops/cargo_rustc/context.rs b/src/cargo/ops/cargo_rustc/context.rs index 5ff2a6c8fee..7cbd2149fe4 100644 --- a/src/cargo/ops/cargo_rustc/context.rs +++ b/src/cargo/ops/cargo_rustc/context.rs @@ -156,7 +156,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } })); } - for dep in try!(self.dep_targets(&unit, self.config)) { + for dep in try!(self.dep_targets(&unit)) { try!(self.visit_crate_type(&dep, crate_types)); } Ok(()) @@ -251,8 +251,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { for unit in units { try!(self.walk_used_in_plugin_map(unit, unit.target.for_host(), - &mut visited, - self.config)); + &mut visited)); } Ok(()) } @@ -260,8 +259,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { fn walk_used_in_plugin_map(&mut self, unit: &Unit<'a>, is_plugin: bool, - visited: &mut HashSet<(Unit<'a>, bool)>, - config: &Config) + visited: &mut HashSet<(Unit<'a>, bool)>) -> CargoResult<()> { if !visited.insert((*unit, is_plugin)) { return Ok(()) @@ -269,11 +267,10 @@ impl<'a, 'cfg> Context<'a, 'cfg> { if is_plugin { self.used_in_plugin.insert(*unit); } - for unit in try!(self.dep_targets(unit, config)) { + for unit in try!(self.dep_targets(unit)) { try!(self.walk_used_in_plugin_map(&unit, is_plugin || unit.target.for_host(), - visited, - config)); + visited)); } Ok(()) } @@ -446,11 +443,11 @@ impl<'a, 'cfg> Context<'a, 'cfg> { /// For a package, return all targets which are registered as dependencies /// for that package. - pub fn dep_targets(&self, unit: &Unit<'a>, config: &Config) -> CargoResult>> { + pub fn dep_targets(&self, unit: &Unit<'a>) -> CargoResult>> { if unit.profile.run_custom_build { return self.dep_run_custom_build(unit) } else if unit.profile.doc { - return self.doc_deps(unit, config); + return self.doc_deps(unit); } let id = unit.pkg.package_id(); @@ -493,7 +490,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { true }) }).filter_map(|id| { - match self.get_package(id, config) { + match self.get_package(id) { Ok(pkg) => { pkg.targets().iter().find(|t| t.is_lib()).map(|t| { Ok(Unit { @@ -567,7 +564,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { profile: &self.profiles.dev, ..*unit }; - let deps = try!(self.dep_targets(&tmp, self.config)); + let deps = try!(self.dep_targets(&tmp)); Ok(deps.iter().filter_map(|unit| { if !unit.target.linkable() || unit.pkg.manifest().links().is_none() { return None @@ -581,7 +578,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } /// Returns the dependencies necessary to document a package - fn doc_deps(&self, unit: &Unit<'a>, config: &Config) -> CargoResult>> { + fn doc_deps(&self, unit: &Unit<'a>) -> CargoResult>> { let deps = self.resolve.deps(unit.pkg.package_id()).filter(|dep| { unit.pkg.dependencies().iter().filter(|d| { d.name() == dep.name() @@ -593,7 +590,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } }) }).map(|dep| { - self.get_package(dep, config) + self.get_package(dep) }); // To document a library, we depend on dependencies actually being @@ -676,8 +673,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } /// Gets a package for the given package id. - pub fn get_package(&self, id: &PackageId, config: &Config) -> CargoResult<&'a Package> { - self.packages.get(id, config) + pub fn get_package(&self, id: &PackageId) -> CargoResult<&'a Package> { + self.packages.get(id) } /// Get the user-specified linker for a particular host or target diff --git a/src/cargo/ops/cargo_rustc/custom_build.rs b/src/cargo/ops/cargo_rustc/custom_build.rs index c78d067d618..5a15e85a853 100644 --- a/src/cargo/ops/cargo_rustc/custom_build.rs +++ b/src/cargo/ops/cargo_rustc/custom_build.rs @@ -413,7 +413,7 @@ pub fn build_map<'b, 'cfg>(cx: &mut Context<'b, 'cfg>, if !unit.target.is_custom_build() && unit.pkg.has_custom_build() { add_to_link(&mut ret, unit.pkg.package_id(), unit.kind); } - for unit in try!(cx.dep_targets(unit, cx.config)).iter() { + for unit in try!(cx.dep_targets(unit)).iter() { let dep_scripts = try!(build(out, cx, unit)); if unit.target.for_host() { diff --git a/src/cargo/ops/cargo_rustc/fingerprint.rs b/src/cargo/ops/cargo_rustc/fingerprint.rs index a24d7ad2b6d..702deb5f863 100644 --- a/src/cargo/ops/cargo_rustc/fingerprint.rs +++ b/src/cargo/ops/cargo_rustc/fingerprint.rs @@ -345,7 +345,7 @@ fn calculate<'a, 'cfg>(cx: &mut Context<'a, 'cfg>, unit: &Unit<'a>) // elsewhere. Also skip fingerprints of binaries because they don't actually // induce a recompile, they're just dependencies in the sense that they need // to be built. - let deps = try!(cx.dep_targets(unit, cx.config)); + let deps = try!(cx.dep_targets(unit)); let deps = try!(deps.iter().filter(|u| { !u.target.is_custom_build() && !u.target.is_bin() }).map(|unit| { diff --git a/src/cargo/ops/cargo_rustc/job_queue.rs b/src/cargo/ops/cargo_rustc/job_queue.rs index db359a7345a..53bad6b786c 100644 --- a/src/cargo/ops/cargo_rustc/job_queue.rs +++ b/src/cargo/ops/cargo_rustc/job_queue.rs @@ -323,12 +323,12 @@ impl<'a> Key<'a> { fn dependencies<'cfg>(&self, cx: &Context<'a, 'cfg>) -> CargoResult>> { let unit = Unit { - pkg: try!(cx.get_package(self.pkg, cx.config)), + pkg: try!(cx.get_package(self.pkg)), target: self.target, profile: self.profile, kind: self.kind, }; - let targets = try!(cx.dep_targets(&unit, cx.config)); + let targets = try!(cx.dep_targets(&unit)); Ok(targets.iter().filter_map(|unit| { // Binaries aren't actually needed to *compile* tests, just to run // them, so we don't include this dependency edge in the job graph. diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 660f517ca8f..280b6c05df5 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -130,7 +130,7 @@ pub fn compile_targets<'a, 'cfg: 'a>(ws: &Workspace<'cfg>, if !unit.target.is_lib() { continue } // Include immediate lib deps as well - for unit in try!(cx.dep_targets(unit, cx.config)).iter() { + for unit in try!(cx.dep_targets(unit)).iter() { let pkgid = unit.pkg.package_id(); if !unit.target.is_lib() { continue } if unit.profile.doc { continue } @@ -197,7 +197,7 @@ fn compile<'a, 'cfg: 'a>(cx: &mut Context<'a, 'cfg>, drop(p); // Be sure to compile all dependencies of this target as well. - for unit in try!(cx.dep_targets(unit, cx.config)).iter() { + for unit in try!(cx.dep_targets(unit)).iter() { try!(compile(cx, jobs, unit)); } Ok(()) @@ -652,7 +652,7 @@ fn build_deps_args(cmd: &mut CommandPrototype, cx: &Context, unit: &Unit) cmd.env("OUT_DIR", &layout.build_out(unit.pkg)); } - for unit in try!(cx.dep_targets(unit, cx.config)).iter() { + for unit in try!(cx.dep_targets(unit)).iter() { if unit.target.linkable() && !unit.profile.doc { try!(link_to(cmd, cx, unit)); } diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 6b114dd61cc..af912b0dfba 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -127,7 +127,7 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry, None => root_replace.to_vec(), }; - let mut resolved = try!(resolver::resolve(&summaries, &replace, registry, ws.config())); + let mut resolved = try!(resolver::resolve(&summaries, &replace, registry)); if let Some(previous) = previous { try!(resolved.merge_from(previous)); } diff --git a/src/cargo/sources/directory.rs b/src/cargo/sources/directory.rs index 650a5092413..84a9501a03b 100644 --- a/src/cargo/sources/directory.rs +++ b/src/cargo/sources/directory.rs @@ -44,7 +44,7 @@ impl<'cfg> Debug for DirectorySource<'cfg> { } impl<'cfg> Registry for DirectorySource<'cfg> { - fn query(&mut self, dep: &Dependency, _config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { let packages = self.packages.values().map(|p| &p.0); let matches = packages.filter(|pkg| dep.matches(pkg.summary())); let summaries = matches.map(|pkg| pkg.summary().clone()); @@ -98,7 +98,7 @@ impl<'cfg> Source for DirectorySource<'cfg> { Ok(()) } - fn download(&mut self, id: &PackageId, _config: &Config) -> CargoResult { + fn download(&mut self, id: &PackageId) -> CargoResult { self.packages.get(id).map(|p| &p.0).cloned().chain_error(|| { human(format!("failed to find package with id: {}", id)) }) diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index 87e424810a9..eeffcb05b72 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -114,10 +114,10 @@ impl<'cfg> Debug for GitSource<'cfg> { } impl<'cfg> Registry for GitSource<'cfg> { - fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { let src = self.path_source.as_mut() .expect("BUG: update() must be called before query()"); - src.query(dep, config) + src.query(dep) } } @@ -175,12 +175,12 @@ impl<'cfg> Source for GitSource<'cfg> { self.path_source.as_mut().unwrap().update() } - fn download(&mut self, id: &PackageId, config: &Config) -> CargoResult { + fn download(&mut self, id: &PackageId) -> CargoResult { trace!("getting packages for package id `{}` from `{:?}`", id, self.remote); self.path_source.as_mut() .expect("BUG: update() must be called before get()") - .download(id, config) + .download(id) } fn fingerprint(&self, _pkg: &Package) -> CargoResult { diff --git a/src/cargo/sources/path.rs b/src/cargo/sources/path.rs index cee7f6cf3f1..052d01c7dab 100644 --- a/src/cargo/sources/path.rs +++ b/src/cargo/sources/path.rs @@ -310,8 +310,8 @@ impl<'cfg> Debug for PathSource<'cfg> { } impl<'cfg> Registry for PathSource<'cfg> { - fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { - self.packages.query(dep, config) + fn query(&mut self, dep: &Dependency) -> CargoResult> { + self.packages.query(dep) } } @@ -326,7 +326,7 @@ impl<'cfg> Source for PathSource<'cfg> { Ok(()) } - fn download(&mut self, id: &PackageId, _config: &Config) -> CargoResult { + fn download(&mut self, id: &PackageId) -> CargoResult { trace!("getting packages; id={}", id); let pkg = self.packages.iter().find(|pkg| pkg.package_id() == id); diff --git a/src/cargo/sources/registry/index.rs b/src/cargo/sources/registry/index.rs index 9d50b4f75bb..e7bd2b87223 100644 --- a/src/cargo/sources/registry/index.rs +++ b/src/cargo/sources/registry/index.rs @@ -35,13 +35,13 @@ impl<'cfg> RegistryIndex<'cfg> { } /// Return the hash listed for a specified PackageId. - pub fn hash(&mut self, pkg: &PackageId, config: &Config) -> CargoResult { + pub fn hash(&mut self, pkg: &PackageId) -> CargoResult { let key = (pkg.name().to_string(), pkg.version().to_string()); if let Some(s) = self.hashes.get(&key) { return Ok(s.clone()) } // Ok, we're missing the key, so parse the index file to load it. - try!(self.summaries(pkg.name(), config)); + try!(self.summaries(pkg.name())); self.hashes.get(&key).chain_error(|| { internal(format!("no hash listed for {}", pkg)) }).map(|s| s.clone()) @@ -51,11 +51,11 @@ impl<'cfg> RegistryIndex<'cfg> { /// /// Returns a list of pairs of (summary, yanked) for the package name /// specified. - pub fn summaries(&mut self, name: &str, config: &Config) -> CargoResult<&Vec<(Summary, bool)>> { + pub fn summaries(&mut self, name: &str) -> CargoResult<&Vec<(Summary, bool)>> { if self.cache.contains_key(name) { return Ok(self.cache.get(name).unwrap()); } - let summaries = try!(self.load_summaries(name, config)); + let summaries = try!(self.load_summaries(name)); let summaries = summaries.into_iter().filter(|summary| { summary.0.package_id().name() == name }).collect(); @@ -63,7 +63,7 @@ impl<'cfg> RegistryIndex<'cfg> { Ok(self.cache.get(name).unwrap()) } - fn load_summaries(&mut self, name: &str, config: &Config) -> CargoResult> { + fn load_summaries(&mut self, name: &str) -> CargoResult> { let (path, _lock) = if self.locked { let lock = self.path.open_ro(Path::new(INDEX_LOCK), self.config, @@ -97,7 +97,7 @@ impl<'cfg> RegistryIndex<'cfg> { try!(f.read_to_string(&mut contents)); let ret: CargoResult>; ret = contents.lines().filter(|l| l.trim().len() > 0) - .map(|l| self.parse_registry_package(l, config)) + .map(|l| self.parse_registry_package(l)) .collect(); ret.chain_error(|| { internal(format!("failed to parse registry's information \ @@ -112,14 +112,14 @@ impl<'cfg> RegistryIndex<'cfg> { /// package. /// /// The returned boolean is whether or not the summary has been yanked. - fn parse_registry_package(&mut self, line: &str, config: &Config) + fn parse_registry_package(&mut self, line: &str) -> CargoResult<(Summary, bool)> { let RegistryPackage { name, vers, cksum, deps, features, yanked } = try!(json::decode::(line)); let pkgid = try!(PackageId::new(&name, &vers, &self.source_id)); let deps: CargoResult> = deps.into_iter().map(|dep| { - self.parse_registry_dependency(dep, config) + self.parse_registry_dependency(dep) }).collect(); let deps = try!(deps); let summary = try!(Summary::new(pkgid, deps, features)); @@ -129,14 +129,15 @@ impl<'cfg> RegistryIndex<'cfg> { } /// Converts an encoded dependency in the registry to a cargo dependency - fn parse_registry_dependency(&self, dep: RegistryDependency, config: &Config) + fn parse_registry_dependency(&self, dep: RegistryDependency) -> CargoResult { let RegistryDependency { name, req, features, optional, default_features, target, kind } = dep; let dep = try!(DependencyInner::parse(&name, Some(&req), - &self.source_id, config)); + &self.source_id, + self.config)); let kind = match kind.as_ref().map(|s| &s[..]).unwrap_or("") { "dev" => Kind::Development, "build" => Kind::Build, @@ -165,9 +166,9 @@ impl<'cfg> RegistryIndex<'cfg> { } impl<'cfg> Registry for RegistryIndex<'cfg> { - fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { let mut summaries = { - let summaries = try!(self.summaries(dep.name(), config)); + let summaries = try!(self.summaries(dep.name())); summaries.iter().filter(|&&(_, yanked)| { dep.source_id().precise().is_some() || !yanked }).map(|s| s.0.clone()).collect::>() @@ -187,7 +188,7 @@ impl<'cfg> Registry for RegistryIndex<'cfg> { _ => true, } }); - summaries.query(dep, config) + summaries.query(dep) } fn supports_checksums(&self) -> bool { diff --git a/src/cargo/sources/registry/mod.rs b/src/cargo/sources/registry/mod.rs index 2b959b163f2..3a1babafb04 100644 --- a/src/cargo/sources/registry/mod.rs +++ b/src/cargo/sources/registry/mod.rs @@ -317,18 +317,18 @@ impl<'cfg> RegistrySource<'cfg> { } impl<'cfg> Registry for RegistrySource<'cfg> { - fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { // If this is a precise dependency, then it came from a lockfile and in // theory the registry is known to contain this version. If, however, we // come back with no summaries, then our registry may need to be // updated, so we fall back to performing a lazy update. if dep.source_id().precise().is_some() && !self.updated { - if try!(self.index.query(dep, config)).is_empty() { + if try!(self.index.query(dep)).is_empty() { try!(self.do_update()); } } - self.index.query(dep, config) + self.index.query(dep) } fn supports_checksums(&self) -> bool { @@ -351,15 +351,15 @@ impl<'cfg> Source for RegistrySource<'cfg> { Ok(()) } - fn download(&mut self, package: &PackageId, config: &Config) -> CargoResult { - let hash = try!(self.index.hash(package, config)); + fn download(&mut self, package: &PackageId) -> CargoResult { + let hash = try!(self.index.hash(package)); let path = try!(self.ops.download(package, &hash)); let path = try!(self.unpack_package(package, &path).chain_error(|| { internal(format!("failed to unpack package `{}`", package)) })); let mut src = PathSource::new(&path, &self.source_id, self.config); try!(src.update()); - src.download(package, config) + src.download(package) } fn fingerprint(&self, pkg: &Package) -> CargoResult { diff --git a/src/cargo/sources/replaced.rs b/src/cargo/sources/replaced.rs index ad94d101cb8..7fb95bdf6c8 100644 --- a/src/cargo/sources/replaced.rs +++ b/src/cargo/sources/replaced.rs @@ -1,5 +1,5 @@ use core::{Source, Registry, PackageId, Package, Dependency, Summary, SourceId}; -use util::{CargoResult, ChainError, human, Config}; +use util::{CargoResult, ChainError, human}; pub struct ReplacedSource<'cfg> { to_replace: SourceId, @@ -20,9 +20,9 @@ impl<'cfg> ReplacedSource<'cfg> { } impl<'cfg> Registry for ReplacedSource<'cfg> { - fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { let dep = dep.clone().map_source(&self.to_replace, &self.replace_with); - let ret = try!(self.inner.query(&dep, config).chain_error(|| { + let ret = try!(self.inner.query(&dep).chain_error(|| { human(format!("failed to query replaced source `{}`", self.to_replace)) })); @@ -40,9 +40,9 @@ impl<'cfg> Source for ReplacedSource<'cfg> { }) } - fn download(&mut self, id: &PackageId, config: &Config) -> CargoResult { + fn download(&mut self, id: &PackageId) -> CargoResult { let id = id.with_source_id(&self.replace_with); - let pkg = try!(self.inner.download(&id, config).chain_error(|| { + let pkg = try!(self.inner.download(&id).chain_error(|| { human(format!("failed to download replaced source `{}`", self.to_replace)) })); diff --git a/tests/resolve.rs b/tests/resolve.rs index 8ed295e91a8..56ae25c6262 100644 --- a/tests/resolve.rs +++ b/tests/resolve.rs @@ -16,13 +16,11 @@ use cargo::core::resolver::{self, Method}; fn resolve(pkg: PackageId, deps: Vec, registry: &mut R) -> CargoResult> { - let config = Config::default().unwrap(); let summary = Summary::new(pkg.clone(), deps, HashMap::new()).unwrap(); let method = Method::Everything; Ok(try!(resolver::resolve(&[(summary, method)], &[], - registry, - &config)).iter().map(|p| { + registry)).iter().map(|p| { p.clone() }).collect()) } From c810424c98c208a2427cfc4a4a435b31ad625d76 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 7 Oct 2016 12:34:00 -0700 Subject: [PATCH 6/8] Tweak message in Dependency::parse Provide some contextual information about why a dependency failed to parse. --- src/cargo/core/dependency.rs | 51 ++++++++++++++++++++++++----- src/cargo/core/registry.rs | 6 ++-- src/cargo/ops/cargo_install.rs | 9 +++-- src/cargo/sources/registry/index.rs | 4 +-- src/cargo/util/toml.rs | 11 ++++++- tests/resolve.rs | 11 +++---- 6 files changed, 65 insertions(+), 27 deletions(-) diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index bd909b309d9..b96fed73f1d 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -88,12 +88,21 @@ impl Encodable for Kind { impl DependencyInner { /// Attempt to create a `Dependency` from an entry in the manifest. + /// + /// The `deprecated_extra` information is set to `Some` when this method + /// should *also* parse historically deprecated semver requirements. This + /// information allows providing diagnostic information about what's going + /// on. + /// + /// If set to `None`, then historically deprecated semver requirements will + /// all be rejected. pub fn parse(name: &str, version: Option<&str>, source_id: &SourceId, - config: &Config) -> CargoResult { + deprecated_extra: Option<(&PackageId, &Config)>) + -> CargoResult { let (specified_req, version_req) = match version { - Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v, config))), + Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v, deprecated_extra))), None => (false, VersionReq::any()) }; @@ -105,16 +114,31 @@ impl DependencyInner { }) } - fn parse_with_deprecated(req: &str, config: &Config) -> CargoResult { + fn parse_with_deprecated(req: &str, + extra: Option<(&PackageId, &Config)>) + -> CargoResult { match VersionReq::parse(req) { Err(e) => { + let (inside, config) = match extra { + Some(pair) => pair, + None => return Err(e.into()), + }; match e { ReqParseError::DeprecatedVersionRequirement(requirement) => { - let msg = format!("One of your version requirements ({}) is invalid. \ -Previous versions of Cargo accepted this malformed requirement, but it is being deprecated. Please \ -use {} instead.", req, requirement); + let msg = format!("\ +parsed version requirement `{}` is no longer valid + +Previous versions of Cargo accepted this malformed requirement, +but it is being deprecated. This was found when parsing the manifest +of {} {}, and the correct version requirement is `{}`. + +This will soon become a hard error, so it's either recommended to +update to a fixed version or contact the upstream maintainer about +this warning. +", + req, inside.name(), inside.version(), requirement); try!(config.shell().warn(&msg)); - + Ok(requirement) } e => Err(From::from(e)), @@ -238,8 +262,19 @@ impl Dependency { pub fn parse(name: &str, version: Option<&str>, source_id: &SourceId, + inside: &PackageId, config: &Config) -> CargoResult { - DependencyInner::parse(name, version, source_id, config).map(|di| { + let arg = Some((inside, config)); + DependencyInner::parse(name, version, source_id, arg).map(|di| { + di.into_dependency() + }) + } + + /// Attempt to create a `Dependency` from an entry in the manifest. + pub fn parse_no_deprecated(name: &str, + version: Option<&str>, + source_id: &SourceId) -> CargoResult { + DependencyInner::parse(name, version, source_id, None).map(|di| { di.into_dependency() }) } diff --git a/src/cargo/core/registry.rs b/src/cargo/core/registry.rs index bea9e6a1041..854340077c6 100644 --- a/src/cargo/core/registry.rs +++ b/src/cargo/core/registry.rs @@ -364,7 +364,7 @@ impl<'cfg> Registry for PackageRegistry<'cfg> { #[cfg(test)] pub mod test { use core::{Summary, Registry, Dependency}; - use util::{CargoResult, Config}; + use util::CargoResult; pub struct RegistryBuilder { summaries: Vec, @@ -405,13 +405,13 @@ pub mod test { } impl Registry for RegistryBuilder { - fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult> { + fn query(&mut self, dep: &Dependency) -> CargoResult> { debug!("querying; dep={:?}", dep); let overrides = self.query_overrides(dep); if overrides.is_empty() { - self.summaries.query(dep, config) + self.summaries.query(dep) } else { Ok(overrides) } diff --git a/src/cargo/ops/cargo_install.rs b/src/cargo/ops/cargo_install.rs index 59d16e27286..93ceb40409a 100644 --- a/src/cargo/ops/cargo_install.rs +++ b/src/cargo/ops/cargo_install.rs @@ -57,7 +57,7 @@ pub fn install(root: Option<&str>, let map = try!(SourceConfigMap::new(config)); let (pkg, source) = if source_id.is_git() { try!(select_pkg(GitSource::new(source_id, config), source_id, - krate, vers, config, &mut |git| git.read_packages())) + krate, vers, &mut |git| git.read_packages())) } else if source_id.is_path() { let path = source_id.url().to_file_path().ok() .expect("path sources must have a valid path"); @@ -68,11 +68,11 @@ pub fn install(root: Option<&str>, specify an alternate source", path.display())) })); try!(select_pkg(PathSource::new(&path, source_id, config), - source_id, krate, vers, config, + source_id, krate, vers, &mut |path| path.read_packages())) } else { try!(select_pkg(try!(map.load(source_id)), - source_id, krate, vers, config, + source_id, krate, vers, &mut |_| Err(human("must specify a crate to install from \ crates.io, or use --path or --git to \ specify alternate source")))) @@ -251,7 +251,6 @@ fn select_pkg<'a, T>(mut source: T, source_id: &SourceId, name: Option<&str>, vers: Option<&str>, - config: &Config, list_all: &mut FnMut(&mut T) -> CargoResult>) -> CargoResult<(Package, Box)> where T: Source + 'a @@ -259,7 +258,7 @@ fn select_pkg<'a, T>(mut source: T, try!(source.update()); match name { Some(name) => { - let dep = try!(Dependency::parse(name, vers, source_id, config)); + let dep = try!(Dependency::parse_no_deprecated(name, vers, source_id)); let deps = try!(source.query(&dep)); match deps.iter().map(|p| p.package_id()).max() { Some(pkgid) => { diff --git a/src/cargo/sources/registry/index.rs b/src/cargo/sources/registry/index.rs index e7bd2b87223..cda824676d4 100644 --- a/src/cargo/sources/registry/index.rs +++ b/src/cargo/sources/registry/index.rs @@ -135,9 +135,7 @@ impl<'cfg> RegistryIndex<'cfg> { name, req, features, optional, default_features, target, kind } = dep; - let dep = try!(DependencyInner::parse(&name, Some(&req), - &self.source_id, - self.config)); + let dep = try!(DependencyInner::parse(&name, Some(&req), &self.source_id, None)); let kind = match kind.as_ref().map(|s| &s[..]).unwrap_or("") { "dev" => Kind::Development, "build" => Kind::Build, diff --git a/src/cargo/util/toml.rs b/src/cargo/util/toml.rs index 06a169bed58..b3de140969d 100644 --- a/src/cargo/util/toml.rs +++ b/src/cargo/util/toml.rs @@ -336,6 +336,7 @@ impl TomlProject { } struct Context<'a, 'b> { + pkgid: Option<&'a PackageId>, deps: &'a mut Vec, source_id: &'a SourceId, nested_paths: &'a mut Vec, @@ -566,6 +567,7 @@ impl TomlManifest { { let mut cx = Context { + pkgid: Some(&pkgid), deps: &mut deps, source_id: source_id, nested_paths: &mut nested_paths, @@ -714,6 +716,7 @@ impl TomlManifest { let mut warnings = Vec::new(); let mut deps = Vec::new(); let replace = try!(self.replace(&mut Context { + pkgid: None, deps: &mut deps, source_id: source_id, nested_paths: &mut nested_paths, @@ -883,7 +886,13 @@ impl TomlDependency { }; let version = details.version.as_ref().map(|v| &v[..]); - let mut dep = try!(DependencyInner::parse(name, version, &new_source_id, cx.config)); + let mut dep = match cx.pkgid { + Some(id) => { + try!(DependencyInner::parse(name, version, &new_source_id, + Some((id, cx.config)))) + } + None => try!(DependencyInner::parse(name, version, &new_source_id, None)), + }; dep = dep.set_features(details.features.unwrap_or(Vec::new())) .set_default_features(details.default_features.unwrap_or(true)) .set_optional(details.optional.unwrap_or(false)) diff --git a/tests/resolve.rs b/tests/resolve.rs index 56ae25c6262..9129a1e6e92 100644 --- a/tests/resolve.rs +++ b/tests/resolve.rs @@ -10,7 +10,7 @@ use hamcrest::{assert_that, equal_to, contains}; use cargo::core::source::{SourceId, GitReference}; use cargo::core::dependency::Kind::{self, Development}; use cargo::core::{Dependency, PackageId, Summary, Registry}; -use cargo::util::{CargoResult, ToUrl, Config}; +use cargo::util::{CargoResult, ToUrl}; use cargo::core::resolver::{self, Method}; fn resolve(pkg: PackageId, deps: Vec, @@ -33,8 +33,7 @@ impl ToDep for &'static str { fn to_dep(self) -> Dependency { let url = "http://example.com".to_url().unwrap(); let source_id = SourceId::for_registry(&url); - let config = Config::default().unwrap(); - Dependency::parse(self, Some("1.0.0"), &source_id, &config).unwrap() + Dependency::parse_no_deprecated(self, Some("1.0.0"), &source_id).unwrap() } } @@ -102,16 +101,14 @@ fn dep(name: &str) -> Dependency { dep_req(name, "1.0.0") } fn dep_req(name: &str, req: &str) -> Dependency { let url = "http://example.com".to_url().unwrap(); let source_id = SourceId::for_registry(&url); - let config = Config::default().unwrap(); - Dependency::parse(name, Some(req), &source_id, &config).unwrap() + Dependency::parse_no_deprecated(name, Some(req), &source_id).unwrap() } fn dep_loc(name: &str, location: &str) -> Dependency { let url = location.to_url().unwrap(); let master = GitReference::Branch("master".to_string()); let source_id = SourceId::for_git(&url, master); - let config = Config::default().unwrap(); - Dependency::parse(name, Some("1.0.0"), &source_id, &config).unwrap() + Dependency::parse_no_deprecated(name, Some("1.0.0"), &source_id).unwrap() } fn dep_kind(name: &str, kind: Kind) -> Dependency { dep(name).clone_inner().set_kind(kind).into_dependency() From f40f8c662a8376021e7e10a6f58f939bea2616ac Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 7 Oct 2016 12:43:48 -0700 Subject: [PATCH 7/8] Add a test for deprecation warnings --- tests/registry.rs | 98 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/tests/registry.rs b/tests/registry.rs index 34150a856b5..e95dc1e49ea 100644 --- a/tests/registry.rs +++ b/tests/registry.rs @@ -1242,3 +1242,101 @@ fn bump_version_dont_update_registry() { [FINISHED] [..] ")); } + +#[test] +fn old_version_req() { + let p = project("foo") + .file("Cargo.toml", r#" + [project] + name = "bar" + version = "0.5.0" + authors = [] + + [dependencies] + remote = "0.2*" + "#) + .file("src/main.rs", "fn main() {}"); + p.build(); + + Package::new("remote", "0.2.0").publish(); + + assert_that(p.cargo("build"), + execs().with_status(0) + .with_stderr("\ +warning: parsed version requirement `0.2*` is no longer valid + +Previous versions of Cargo accepted this malformed requirement, +but it is being deprecated. This was found when parsing the manifest +of bar 0.5.0, and the correct version requirement is `0.2.*`. + +This will soon become a hard error, so it's either recommended to +update to a fixed version or contact the upstream maintainer about +this warning. + +warning: parsed version requirement `0.2*` is no longer valid + +Previous versions of Cargo accepted this malformed requirement, +but it is being deprecated. This was found when parsing the manifest +of bar 0.5.0, and the correct version requirement is `0.2.*`. + +This will soon become a hard error, so it's either recommended to +update to a fixed version or contact the upstream maintainer about +this warning. + +[UPDATING] [..] +[DOWNLOADING] [..] +[COMPILING] [..] +[COMPILING] [..] +[FINISHED] [..] +")); +} + +#[test] +fn old_version_req_upstream() { + let p = project("foo") + .file("Cargo.toml", r#" + [project] + name = "bar" + version = "0.5.0" + authors = [] + + [dependencies] + remote = "0.3" + "#) + .file("src/main.rs", "fn main() {}"); + p.build(); + + Package::new("remote", "0.3.0") + .file("Cargo.toml", r#" + [project] + name = "remote" + version = "0.3.0" + authors = [] + + [dependencies] + bar = "0.2*" + "#) + .file("src/lib.rs", "") + .publish(); + Package::new("bar", "0.2.0").publish(); + + assert_that(p.cargo("build"), + execs().with_status(0) + .with_stderr("\ +[UPDATING] [..] +[DOWNLOADING] [..] +warning: parsed version requirement `0.2*` is no longer valid + +Previous versions of Cargo accepted this malformed requirement, +but it is being deprecated. This was found when parsing the manifest +of remote 0.3.0, and the correct version requirement is `0.2.*`. + +This will soon become a hard error, so it's either recommended to +update to a fixed version or contact the upstream maintainer about +this warning. + +[COMPILING] [..] +[COMPILING] [..] +[FINISHED] [..] +")); +} From 464e6a96fb599049761a8842c89118bde1683edd Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Fri, 7 Oct 2016 16:03:08 -0400 Subject: [PATCH 8/8] Bump to semver@0.5.0 --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a43b2b6208..fabedb41a84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,7 +27,7 @@ dependencies = [ "psapi-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.1.73 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.4.1 (git+https://github.com/steveklabnik/semver?branch=deprecation)", + "semver 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "tar 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -522,8 +522,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.4.1" -source = "git+https://github.com/steveklabnik/semver?branch=deprecation#a3b67d654d7e00ea0a05a37851f49352d79834a3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -702,7 +702,7 @@ dependencies = [ "checksum regex 0.1.73 (registry+https://github.com/rust-lang/crates.io-index)" = "56b7ee9f764ecf412c6e2fff779bca4b22980517ae335a21aeaf4e32625a5df2" "checksum regex-syntax 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "31040aad7470ad9d8c46302dcffba337bb4289ca5da2e3cd6e37b64109a85199" "checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" -"checksum semver 0.4.1 (git+https://github.com/steveklabnik/semver?branch=deprecation)" = "" +"checksum semver 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a15f0ab63f6018942339e2c038253dba1eb4f8718fbca869b09f9a019572d954" "checksum semver-parser 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e88e43a5a74dd2a11707f9c21dfd4a423c66bd871df813227bb0a3e78f3a1ae9" "checksum strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4d73a2c36a4d095ed1a6df5cbeac159863173447f7a82b3f4757426844ab825" "checksum tar 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "12e1b959f637c2e4c69dbdbf4d7dc609edbaada9b8c35d0c2fc9802d02383b65" diff --git a/Cargo.toml b/Cargo.toml index 563c865278d..99b15db7d2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ num_cpus = "1.0" psapi-sys = "0.1" regex = "0.1" rustc-serialize = "0.3" -semver = { git = "https://github.com/steveklabnik/semver", branch = "deprecation" } +semver = "0.5.0" tar = { version = "0.4", default-features = false } tempdir = "0.3" term = "0.4.4"