diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index c24853f51..f96c20691 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -86,19 +86,18 @@ pub enum Kind { } fn parse_req_with_deprecated( + name: &str, req: &str, extra: Option<(&PackageId, &Config)>, ) -> CargoResult { match VersionReq::parse(req) { - Err(e) => { + Err(ReqParseError::DeprecatedVersionRequirement(requirement)) => { let (inside, config) = match extra { Some(pair) => pair, - None => return Err(e.into()), + None => return Err(ReqParseError::DeprecatedVersionRequirement(requirement).into()), }; - match e { - ReqParseError::DeprecatedVersionRequirement(requirement) => { - let msg = format!( - "\ + let msg = format!( + "\ parsed version requirement `{}` is no longer valid Previous versions of Cargo accepted this malformed requirement, @@ -109,18 +108,25 @@ 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 - ); - config.shell().warn(&msg)?; + req, + inside.name(), + inside.version(), + requirement + ); + config.shell().warn(&msg)?; - Ok(requirement) - } - e => Err(e.into()), - } - } + Ok(requirement) + }, + Err(e) => { + let err: CargoResult = Err(e.into()); + let v: VersionReq = err.chain_err(|| { + format!( + "failed to parse the version requirement `{}` for dependency `{}`", + req, name + ) + })?; + Ok(v) + }, Ok(v) => Ok(v), } } @@ -149,7 +155,7 @@ impl Dependency { ) -> CargoResult { let arg = Some((inside, config)); let (specified_req, version_req) = match version { - Some(v) => (true, parse_req_with_deprecated(v, arg)?), + Some(v) => (true, parse_req_with_deprecated(name, v, arg)?), None => (false, VersionReq::any()), }; @@ -170,7 +176,7 @@ impl Dependency { source_id: &SourceId, ) -> CargoResult { let (specified_req, version_req) = match version { - Some(v) => (true, parse_req_with_deprecated(v, None)?), + Some(v) => (true, parse_req_with_deprecated(name, v, None)?), None => (false, VersionReq::any()), }; diff --git a/tests/testsuite/build.rs b/tests/testsuite/build.rs index aba5dbf09..f766126b1 100644 --- a/tests/testsuite/build.rs +++ b/tests/testsuite/build.rs @@ -437,6 +437,36 @@ Caused by: ).run(); } +#[test] +fn cargo_compile_with_invalid_non_numeric_dep_version() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + + [dependencies] + crossbeam = "y" + "#, + ).build(); + + p.cargo("build") + .with_status(101) + .with_stderr( + "\ +[ERROR] failed to parse manifest at `[CWD]/Cargo.toml` + +Caused by: + failed to parse the version requirement `y` for dependency `crossbeam` + +Caused by: + the given version requirement is invalid +", + ).run(); +} + #[test] fn cargo_compile_without_manifest() { let p = project().no_manifest().build();