From d22623466d08f2247250780010ba2470f42c93c7 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Sat, 28 Aug 2021 00:17:39 +0800 Subject: [PATCH] Show original version_req for locked dependency When encounter resolver error with locked dependency, we now show original version req along with the exact locked version. --- src/cargo/core/dependency.rs | 10 ++++++++++ src/cargo/core/resolver/errors.rs | 10 ++++++++-- tests/testsuite/build_script.rs | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index 7ad091c8c..10fae7205 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -339,6 +339,16 @@ impl Dependency { self } + /// Locks this dependency to a specified version. + /// + /// Mainly used in dependency patching like `[patch]` or `[replace]`, which + /// doesn't need to lock the entire dependency to a specific [`PackageId`]. + pub fn lock_version(&mut self, version: &semver::Version) -> &mut Dependency { + let me = Rc::make_mut(&mut self.inner); + me.req.lock_to(version); + self + } + /// Returns `true` if this is a "locked" dependency. Basically a locked /// dependency has an exact version req, but not vice versa. pub fn is_locked(&self) -> bool { diff --git a/src/cargo/core/resolver/errors.rs b/src/cargo/core/resolver/errors.rs index 63d58392d..5cabd01ba 100644 --- a/src/cargo/core/resolver/errors.rs +++ b/src/cargo/core/resolver/errors.rs @@ -387,10 +387,16 @@ pub(crate) fn describe_path<'a>( } else { dep.name_in_toml().to_string() }; + let locked_version = dep + .version_req() + .locked_version() + .map(|v| format!("(locked to {}) ", v)) + .unwrap_or_default(); + write!( dep_path_desc, - "\n ... which satisfies {}dependency `{}` of package `{}`", - source_kind, requirement, pkg + "\n ... which satisfies {}dependency `{}` {}of package `{}`", + source_kind, requirement, locked_version, pkg ) .unwrap(); } diff --git a/tests/testsuite/build_script.rs b/tests/testsuite/build_script.rs index d5306627c..4b8f648b5 100644 --- a/tests/testsuite/build_script.rs +++ b/tests/testsuite/build_script.rs @@ -1000,7 +1000,7 @@ fn links_duplicates_old_registry() { but a native library can be linked only once package `bar v0.1.0` - ... which satisfies dependency `bar = \"=0.1.0\"` of package `foo v0.1.0 ([..]foo)` + ... which satisfies dependency `bar = \"^0.1\"` (locked to 0.1.0) of package `foo v0.1.0 ([..]foo)` links to native library `a` package `foo v0.1.0 ([..]foo)`