Skip to content

Commit c810424

Browse files
committed
Tweak message in Dependency::parse
Provide some contextual information about why a dependency failed to parse.
1 parent 4c1f84b commit c810424

File tree

6 files changed

+65
-27
lines changed

6 files changed

+65
-27
lines changed

src/cargo/core/dependency.rs

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,21 @@ impl Encodable for Kind {
8888

8989
impl DependencyInner {
9090
/// Attempt to create a `Dependency` from an entry in the manifest.
91+
///
92+
/// The `deprecated_extra` information is set to `Some` when this method
93+
/// should *also* parse historically deprecated semver requirements. This
94+
/// information allows providing diagnostic information about what's going
95+
/// on.
96+
///
97+
/// If set to `None`, then historically deprecated semver requirements will
98+
/// all be rejected.
9199
pub fn parse(name: &str,
92100
version: Option<&str>,
93101
source_id: &SourceId,
94-
config: &Config) -> CargoResult<DependencyInner> {
102+
deprecated_extra: Option<(&PackageId, &Config)>)
103+
-> CargoResult<DependencyInner> {
95104
let (specified_req, version_req) = match version {
96-
Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v, config))),
105+
Some(v) => (true, try!(DependencyInner::parse_with_deprecated(v, deprecated_extra))),
97106
None => (false, VersionReq::any())
98107
};
99108

@@ -105,16 +114,31 @@ impl DependencyInner {
105114
})
106115
}
107116

108-
fn parse_with_deprecated(req: &str, config: &Config) -> CargoResult<VersionReq> {
117+
fn parse_with_deprecated(req: &str,
118+
extra: Option<(&PackageId, &Config)>)
119+
-> CargoResult<VersionReq> {
109120
match VersionReq::parse(req) {
110121
Err(e) => {
122+
let (inside, config) = match extra {
123+
Some(pair) => pair,
124+
None => return Err(e.into()),
125+
};
111126
match e {
112127
ReqParseError::DeprecatedVersionRequirement(requirement) => {
113-
let msg = format!("One of your version requirements ({}) is invalid. \
114-
Previous versions of Cargo accepted this malformed requirement, but it is being deprecated. Please \
115-
use {} instead.", req, requirement);
128+
let msg = format!("\
129+
parsed version requirement `{}` is no longer valid
130+
131+
Previous versions of Cargo accepted this malformed requirement,
132+
but it is being deprecated. This was found when parsing the manifest
133+
of {} {}, and the correct version requirement is `{}`.
134+
135+
This will soon become a hard error, so it's either recommended to
136+
update to a fixed version or contact the upstream maintainer about
137+
this warning.
138+
",
139+
req, inside.name(), inside.version(), requirement);
116140
try!(config.shell().warn(&msg));
117-
141+
118142
Ok(requirement)
119143
}
120144
e => Err(From::from(e)),
@@ -238,8 +262,19 @@ impl Dependency {
238262
pub fn parse(name: &str,
239263
version: Option<&str>,
240264
source_id: &SourceId,
265+
inside: &PackageId,
241266
config: &Config) -> CargoResult<Dependency> {
242-
DependencyInner::parse(name, version, source_id, config).map(|di| {
267+
let arg = Some((inside, config));
268+
DependencyInner::parse(name, version, source_id, arg).map(|di| {
269+
di.into_dependency()
270+
})
271+
}
272+
273+
/// Attempt to create a `Dependency` from an entry in the manifest.
274+
pub fn parse_no_deprecated(name: &str,
275+
version: Option<&str>,
276+
source_id: &SourceId) -> CargoResult<Dependency> {
277+
DependencyInner::parse(name, version, source_id, None).map(|di| {
243278
di.into_dependency()
244279
})
245280
}

src/cargo/core/registry.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ impl<'cfg> Registry for PackageRegistry<'cfg> {
364364
#[cfg(test)]
365365
pub mod test {
366366
use core::{Summary, Registry, Dependency};
367-
use util::{CargoResult, Config};
367+
use util::CargoResult;
368368

369369
pub struct RegistryBuilder {
370370
summaries: Vec<Summary>,
@@ -405,13 +405,13 @@ pub mod test {
405405
}
406406

407407
impl Registry for RegistryBuilder {
408-
fn query(&mut self, dep: &Dependency, config: &Config) -> CargoResult<Vec<Summary>> {
408+
fn query(&mut self, dep: &Dependency) -> CargoResult<Vec<Summary>> {
409409
debug!("querying; dep={:?}", dep);
410410

411411
let overrides = self.query_overrides(dep);
412412

413413
if overrides.is_empty() {
414-
self.summaries.query(dep, config)
414+
self.summaries.query(dep)
415415
} else {
416416
Ok(overrides)
417417
}

src/cargo/ops/cargo_install.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub fn install(root: Option<&str>,
5757
let map = try!(SourceConfigMap::new(config));
5858
let (pkg, source) = if source_id.is_git() {
5959
try!(select_pkg(GitSource::new(source_id, config), source_id,
60-
krate, vers, config, &mut |git| git.read_packages()))
60+
krate, vers, &mut |git| git.read_packages()))
6161
} else if source_id.is_path() {
6262
let path = source_id.url().to_file_path().ok()
6363
.expect("path sources must have a valid path");
@@ -68,11 +68,11 @@ pub fn install(root: Option<&str>,
6868
specify an alternate source", path.display()))
6969
}));
7070
try!(select_pkg(PathSource::new(&path, source_id, config),
71-
source_id, krate, vers, config,
71+
source_id, krate, vers,
7272
&mut |path| path.read_packages()))
7373
} else {
7474
try!(select_pkg(try!(map.load(source_id)),
75-
source_id, krate, vers, config,
75+
source_id, krate, vers,
7676
&mut |_| Err(human("must specify a crate to install from \
7777
crates.io, or use --path or --git to \
7878
specify alternate source"))))
@@ -251,15 +251,14 @@ fn select_pkg<'a, T>(mut source: T,
251251
source_id: &SourceId,
252252
name: Option<&str>,
253253
vers: Option<&str>,
254-
config: &Config,
255254
list_all: &mut FnMut(&mut T) -> CargoResult<Vec<Package>>)
256255
-> CargoResult<(Package, Box<Source + 'a>)>
257256
where T: Source + 'a
258257
{
259258
try!(source.update());
260259
match name {
261260
Some(name) => {
262-
let dep = try!(Dependency::parse(name, vers, source_id, config));
261+
let dep = try!(Dependency::parse_no_deprecated(name, vers, source_id));
263262
let deps = try!(source.query(&dep));
264263
match deps.iter().map(|p| p.package_id()).max() {
265264
Some(pkgid) => {

src/cargo/sources/registry/index.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,7 @@ impl<'cfg> RegistryIndex<'cfg> {
135135
name, req, features, optional, default_features, target, kind
136136
} = dep;
137137

138-
let dep = try!(DependencyInner::parse(&name, Some(&req),
139-
&self.source_id,
140-
self.config));
138+
let dep = try!(DependencyInner::parse(&name, Some(&req), &self.source_id, None));
141139
let kind = match kind.as_ref().map(|s| &s[..]).unwrap_or("") {
142140
"dev" => Kind::Development,
143141
"build" => Kind::Build,

src/cargo/util/toml.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ impl TomlProject {
336336
}
337337

338338
struct Context<'a, 'b> {
339+
pkgid: Option<&'a PackageId>,
339340
deps: &'a mut Vec<Dependency>,
340341
source_id: &'a SourceId,
341342
nested_paths: &'a mut Vec<PathBuf>,
@@ -566,6 +567,7 @@ impl TomlManifest {
566567
{
567568

568569
let mut cx = Context {
570+
pkgid: Some(&pkgid),
569571
deps: &mut deps,
570572
source_id: source_id,
571573
nested_paths: &mut nested_paths,
@@ -714,6 +716,7 @@ impl TomlManifest {
714716
let mut warnings = Vec::new();
715717
let mut deps = Vec::new();
716718
let replace = try!(self.replace(&mut Context {
719+
pkgid: None,
717720
deps: &mut deps,
718721
source_id: source_id,
719722
nested_paths: &mut nested_paths,
@@ -883,7 +886,13 @@ impl TomlDependency {
883886
};
884887

885888
let version = details.version.as_ref().map(|v| &v[..]);
886-
let mut dep = try!(DependencyInner::parse(name, version, &new_source_id, cx.config));
889+
let mut dep = match cx.pkgid {
890+
Some(id) => {
891+
try!(DependencyInner::parse(name, version, &new_source_id,
892+
Some((id, cx.config))))
893+
}
894+
None => try!(DependencyInner::parse(name, version, &new_source_id, None)),
895+
};
887896
dep = dep.set_features(details.features.unwrap_or(Vec::new()))
888897
.set_default_features(details.default_features.unwrap_or(true))
889898
.set_optional(details.optional.unwrap_or(false))

tests/resolve.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use hamcrest::{assert_that, equal_to, contains};
1010
use cargo::core::source::{SourceId, GitReference};
1111
use cargo::core::dependency::Kind::{self, Development};
1212
use cargo::core::{Dependency, PackageId, Summary, Registry};
13-
use cargo::util::{CargoResult, ToUrl, Config};
13+
use cargo::util::{CargoResult, ToUrl};
1414
use cargo::core::resolver::{self, Method};
1515

1616
fn resolve<R: Registry>(pkg: PackageId, deps: Vec<Dependency>,
@@ -33,8 +33,7 @@ impl ToDep for &'static str {
3333
fn to_dep(self) -> Dependency {
3434
let url = "http://example.com".to_url().unwrap();
3535
let source_id = SourceId::for_registry(&url);
36-
let config = Config::default().unwrap();
37-
Dependency::parse(self, Some("1.0.0"), &source_id, &config).unwrap()
36+
Dependency::parse_no_deprecated(self, Some("1.0.0"), &source_id).unwrap()
3837
}
3938
}
4039

@@ -102,16 +101,14 @@ fn dep(name: &str) -> Dependency { dep_req(name, "1.0.0") }
102101
fn dep_req(name: &str, req: &str) -> Dependency {
103102
let url = "http://example.com".to_url().unwrap();
104103
let source_id = SourceId::for_registry(&url);
105-
let config = Config::default().unwrap();
106-
Dependency::parse(name, Some(req), &source_id, &config).unwrap()
104+
Dependency::parse_no_deprecated(name, Some(req), &source_id).unwrap()
107105
}
108106

109107
fn dep_loc(name: &str, location: &str) -> Dependency {
110108
let url = location.to_url().unwrap();
111109
let master = GitReference::Branch("master".to_string());
112110
let source_id = SourceId::for_git(&url, master);
113-
let config = Config::default().unwrap();
114-
Dependency::parse(name, Some("1.0.0"), &source_id, &config).unwrap()
111+
Dependency::parse_no_deprecated(name, Some("1.0.0"), &source_id).unwrap()
115112
}
116113
fn dep_kind(name: &str, kind: Kind) -> Dependency {
117114
dep(name).clone_inner().set_kind(kind).into_dependency()

0 commit comments

Comments
 (0)