diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 9cf4a100f..7b92d2e37 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -100,6 +100,7 @@ pub struct Workspace<'gctx> { /// The resolver behavior specified with the `resolver` field. resolve_behavior: ResolveBehavior, + honor_rust_version: Option, /// Workspace-level custom metadata custom_metadata: Option, @@ -229,6 +230,7 @@ impl<'gctx> Workspace<'gctx> { loaded_packages: RefCell::new(HashMap::new()), ignore_lock: false, resolve_behavior: ResolveBehavior::V1, + honor_rust_version: None, custom_metadata: None, } } @@ -605,6 +607,14 @@ impl<'gctx> Workspace<'gctx> { self.members().filter_map(|pkg| pkg.rust_version()).min() } + pub fn set_honor_rust_version(&mut self, honor_rust_version: Option) { + self.honor_rust_version = honor_rust_version; + } + + pub fn resolve_honors_rust_version(&self) -> bool { + self.gctx().cli_unstable().msrv_policy && self.honor_rust_version.unwrap_or(true) + } + pub fn custom_metadata(&self) -> Option<&toml::Value> { self.custom_metadata.as_ref() } @@ -771,7 +781,7 @@ impl<'gctx> Workspace<'gctx> { } } - debug!("find_members - {}", manifest_path.display()); + debug!("find_path_deps - {}", manifest_path.display()); self.members.push(manifest_path.clone()); let candidates = { diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 9b95e4ba6..e9af9f975 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -303,7 +303,7 @@ pub fn resolve_with_previous<'gctx>( if ws.gctx().cli_unstable().minimal_versions { version_prefs.version_ordering(VersionOrdering::MinimumVersionsFirst) } - if ws.gctx().cli_unstable().msrv_policy { + if ws.resolve_honors_rust_version() { version_prefs.max_rust_version(ws.rust_version().cloned().map(RustVersion::into_partial)); } diff --git a/src/cargo/util/command_prelude.rs b/src/cargo/util/command_prelude.rs index 82d8e8c9e..6dfa3512b 100644 --- a/src/cargo/util/command_prelude.rs +++ b/src/cargo/util/command_prelude.rs @@ -504,6 +504,7 @@ pub trait ArgMatchesExt { fn workspace<'a>(&self, gctx: &'a GlobalContext) -> CargoResult> { let root = self.root_manifest(gctx)?; let mut ws = Workspace::new(&root, gctx)?; + ws.set_honor_rust_version(self.honor_rust_version()); if gctx.cli_unstable().avoid_dev_deps { ws.set_require_optional_deps(false); } diff --git a/tests/testsuite/rust_version.rs b/tests/testsuite/rust_version.rs index c007ba7d5..42c265609 100644 --- a/tests/testsuite/rust_version.rs +++ b/tests/testsuite/rust_version.rs @@ -347,15 +347,13 @@ fn dependency_rust_version_older_and_newer_than_package() { p.cargo("check --ignore-rust-version") .arg("-Zmsrv-policy") .masquerade_as_nightly_cargo(&["msrv-policy"]) - // This should pick 1.6.0 .with_stderr( "\ [UPDATING] `dummy-registry` index [LOCKING] 2 packages -[ADDING] bar v1.5.0 (latest: v1.6.0) [DOWNLOADING] crates ... -[DOWNLOADED] bar v1.5.0 (registry `dummy-registry`) -[CHECKING] bar v1.5.0 +[DOWNLOADED] bar v1.6.0 (registry `dummy-registry`) +[CHECKING] bar v1.6.0 [CHECKING] [..] [FINISHED] [..] ", @@ -483,15 +481,13 @@ fn workspace_with_mixed_rust_version() { p.cargo("check --ignore-rust-version") .arg("-Zmsrv-policy") .masquerade_as_nightly_cargo(&["msrv-policy"]) - // This should pick 1.6.0 .with_stderr( "\ [UPDATING] `dummy-registry` index [LOCKING] 3 packages -[ADDING] bar v1.4.0 (latest: v1.6.0) [DOWNLOADING] crates ... -[DOWNLOADED] bar v1.4.0 (registry `dummy-registry`) -[CHECKING] bar v1.4.0 +[DOWNLOADED] bar v1.6.0 (registry `dummy-registry`) +[CHECKING] bar v1.6.0 [CHECKING] [..] [FINISHED] [..] ",