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)`