Skip to content

Commit 79f3229

Browse files
committed
Emit a single warning detailing all inconsistent resolvers in the workspace
1 parent 0026431 commit 79f3229

File tree

2 files changed

+59
-28
lines changed

2 files changed

+59
-28
lines changed

src/cargo/core/workspace.rs

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -980,39 +980,56 @@ impl<'cfg> Workspace<'cfg> {
980980
if !manifest.patch().is_empty() {
981981
emit_warning("patch")?;
982982
}
983-
if manifest.defaulted_resolve_behavior() != self.resolve_behavior {
984-
let package_reason = manifest
985-
.resolve_behavior()
986-
.is_none()
987-
.then(|| format!(r#" implied by edition = "{}""#, manifest.edition()))
988-
.unwrap_or_default();
989-
let workspace_reason = match self.root_maybe() {
983+
}
984+
let mut inconsistent_resolvers: Vec<_> = self
985+
.members()
986+
.filter(|p| p.manifest_path() != root_manifest)
987+
.filter(|p| p.manifest().defaulted_resolve_behavior() != self.resolve_behavior)
988+
.map(|pkg| {
989+
format!(
990+
r#"package: {} expects resolver = "{}"{}"#,
991+
pkg.manifest_path().display(),
992+
pkg.manifest()
993+
.defaulted_resolve_behavior()
994+
.to_manifest()
995+
.unwrap_or_else(|| "1".into()),
996+
pkg.manifest()
997+
.resolve_behavior()
998+
.is_none()
999+
.then(|| format!(
1000+
r#" implied by edition = "{}""#,
1001+
pkg.manifest().edition()
1002+
))
1003+
.unwrap_or_default()
1004+
)
1005+
})
1006+
.collect();
1007+
if !inconsistent_resolvers.is_empty() {
1008+
inconsistent_resolvers.insert(
1009+
0,
1010+
"expected resolver for package(s) are overridden by the workspace root:".into(),
1011+
);
1012+
inconsistent_resolvers.push(format!(
1013+
r#"workspace: {} sets resolver = "{}"{}"#,
1014+
root_manifest.display(),
1015+
self.resolve_behavior
1016+
.to_manifest()
1017+
.unwrap_or_else(|| "1".into()),
1018+
match self.root_maybe() {
9901019
MaybePackage::Package(p) => {
9911020
p.manifest().resolve_behavior().is_none().then(|| {
992-
format!(r#" implied by edition = "{}""#, manifest.edition())
1021+
format!(r#" implied by edition = "{}""#, p.manifest().edition())
9931022
})
9941023
}
9951024
MaybePackage::Virtual(vm) => {
9961025
vm.resolve_behavior().is_none().then(|| " (default)".into())
9971026
}
9981027
}
999-
.unwrap_or_default();
1000-
let msg = format!(
1001-
"expected resolver for package is overridden by the workspace root:\n\
1002-
package: {} expects resolver = \"{}\"{package_reason}\n\
1003-
workspace: {} sets resolver = \"{}\"{workspace_reason}",
1004-
pkg.manifest_path().display(),
1005-
manifest
1006-
.defaulted_resolve_behavior()
1007-
.to_manifest()
1008-
.unwrap_or_else(|| "1".into()),
1009-
root_manifest.display(),
1010-
self.resolve_behavior
1011-
.to_manifest()
1012-
.unwrap_or_else(|| "1".into()),
1013-
);
1014-
self.config.shell().warn(&msg)?;
1015-
}
1028+
.unwrap_or_default(),
1029+
));
1030+
self.config
1031+
.shell()
1032+
.warn(inconsistent_resolvers.join("\n"))?;
10161033
}
10171034
}
10181035
Ok(())

tests/testsuite/features2.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,7 +1390,7 @@ fn resolver_ws_member() {
13901390
p.cargo("check")
13911391
.with_stderr(
13921392
"\
1393-
warning: expected resolver for package is overridden by the workspace root:
1393+
warning: expected resolver for package(s) are overridden by the workspace root:
13941394
package: [..]/foo/a/Cargo.toml expects resolver = \"2\"
13951395
workspace: [..]/foo/Cargo.toml sets resolver = \"1\" (default)
13961396
[CHECKING] a v0.1.0 [..]
@@ -1442,7 +1442,7 @@ fn implicit_resolver_ws_member() {
14421442
"Cargo.toml",
14431443
r#"
14441444
[workspace]
1445-
members = ["a"]
1445+
members = ["a", "b"]
14461446
"#,
14471447
)
14481448
.file(
@@ -1455,15 +1455,29 @@ fn implicit_resolver_ws_member() {
14551455
"#,
14561456
)
14571457
.file("a/src/lib.rs", "")
1458+
.file(
1459+
"b/Cargo.toml",
1460+
r#"
1461+
[package]
1462+
name = "b"
1463+
version = "0.1.0"
1464+
resolver = "2"
1465+
[dependencies]
1466+
a = { path = "../a" } # to force build message order
1467+
"#,
1468+
)
1469+
.file("b/src/lib.rs", "")
14581470
.build();
14591471

14601472
p.cargo("check")
14611473
.with_stderr(
14621474
"\
1463-
warning: expected resolver for package is overridden by the workspace root:
1475+
warning: expected resolver for package(s) are overridden by the workspace root:
14641476
package: [..]/foo/a/Cargo.toml expects resolver = \"2\" implied by edition = \"2021\"
1477+
package: [..]/foo/b/Cargo.toml expects resolver = \"2\"
14651478
workspace: [..]/foo/Cargo.toml sets resolver = \"1\" (default)
14661479
[CHECKING] a v0.1.0 [..]
1480+
[CHECKING] b v0.1.0 [..]
14671481
[FINISHED] [..]
14681482
",
14691483
)

0 commit comments

Comments
 (0)