From 15c7c0847aac42c4f60569ef3e94581fcf9c18c1 Mon Sep 17 00:00:00 2001 From: Jacob Finkelman Date: Wed, 2 Mar 2022 23:03:14 +0000 Subject: [PATCH 1/2] Use locked_version more --- src/cargo/core/resolver/errors.rs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/cargo/core/resolver/errors.rs b/src/cargo/core/resolver/errors.rs index 5cabd01bae4..8d497527276 100644 --- a/src/cargo/core/resolver/errors.rs +++ b/src/cargo/core/resolver/errors.rs @@ -95,7 +95,15 @@ pub(super) fn activation_error( msg.push_str("\nversions that meet the requirements `"); msg.push_str(&dep.version_req().to_string()); - msg.push_str("` are: "); + msg.push_str("` "); + + if let Some(v) = dep.version_req().locked_version() { + msg.push_str("(locked to "); + msg.push_str(&v.to_string()); + msg.push_str(") "); + } + + msg.push_str("are: "); msg.push_str( &candidates .iter() @@ -239,12 +247,19 @@ pub(super) fn activation_error( versions.join(", ") }; + let locked_version = dep + .version_req() + .locked_version() + .map(|v| format!(" (locked to {})", v)) + .unwrap_or_default(); + let mut msg = format!( - "failed to select a version for the requirement `{} = \"{}\"`\n\ + "failed to select a version for the requirement `{} = \"{}\"`{}\n\ candidate versions found which didn't match: {}\n\ location searched: {}\n", dep.package_name(), dep.version_req(), + locked_version, versions, registry.describe_source(dep.source_id()), ); @@ -254,7 +269,7 @@ pub(super) fn activation_error( // If we have a path dependency with a locked version, then this may // indicate that we updated a sub-package and forgot to run `cargo // update`. In this case try to print a helpful error! - if dep.source_id().is_path() && dep.version_req().to_string().starts_with('=') { + if dep.source_id().is_path() && dep.version_req().is_locked() { msg.push_str( "\nconsider running `cargo update` to update \ a path dependency's locked version", From 4164c46a1b6d7ebf017ab0db1a7659be2a5a21e8 Mon Sep 17 00:00:00 2001 From: Jacob Finkelman Date: Thu, 3 Mar 2022 18:30:44 +0000 Subject: [PATCH 2/2] add a test --- tests/testsuite/lockfile_compat.rs | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/testsuite/lockfile_compat.rs b/tests/testsuite/lockfile_compat.rs index 0be1d4aa693..9f490cae2fb 100644 --- a/tests/testsuite/lockfile_compat.rs +++ b/tests/testsuite/lockfile_compat.rs @@ -836,3 +836,55 @@ source = "git+{url}#{sha}" assert_eq!(p.read_file("Cargo.lock"), lockfile); } + +#[cargo_test] +fn bad_data_in_lockfile_error_meg() { + Package::new("bar", "0.0.1").publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "test" + version = "0.0.0" + + [dependencies] + bar = "*" + "#, + ) + .file("src/main.rs", "fn main() {}") + .file( + "Cargo.lock", + r#"# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bar" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1b9346248cf3391ead604c4407258d327c28e37209f6d56127598165165dda" + +[[package]] +name = "test" +version = "0.0.0" +dependencies = [ + "bar", +]"#, + ) + .build(); + p.cargo("build") + .with_status(101) + .with_stderr( + "\ +[..] +[ERROR] failed to select a version for the requirement `bar = \"*\"` (locked to 0.1.0) +candidate versions found which didn't match: 0.0.1 +location searched: `dummy-registry` index (which is replacing registry `crates-io`) +required by package `test v0.0.0 ([..])` +perhaps a crate was updated and forgotten to be re-vendored? +", + ) + .run(); +}