From 2e2b3c1f1ec2ba3d47d0633cffdd9816552b2941 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Thu, 28 Jul 2022 17:42:20 +0200 Subject: [PATCH 1/7] Warn when an edition 2021 crate is in a virtual workspace with default resolver Edition 2021 updates the default resolver to version "2", but developers using virtual workspaces commonly don't get this update because the virtual workspace defaults to version "1". Warn when this situation occurs so those developers can explicitly configure their workspace and will be more likely to know that they will need to update it in the future. --- src/cargo/core/workspace.rs | 19 ++++++++++++++++++- tests/testsuite/features2.rs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 9922d6d331d..c4dc5899ae0 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -15,7 +15,7 @@ use crate::core::features::Features; use crate::core::registry::PackageRegistry; use crate::core::resolver::features::CliFeatures; use crate::core::resolver::ResolveBehavior; -use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec}; +use crate::core::{Dependency, Edition, FeatureValue, PackageId, PackageIdSpec}; use crate::core::{EitherManifest, Package, SourceId, VirtualManifest}; use crate::ops; use crate::sources::{PathSource, CRATES_IO_INDEX, CRATES_IO_REGISTRY}; @@ -993,6 +993,23 @@ impl<'cfg> Workspace<'cfg> { } } } + if let MaybePackage::Virtual(vm) = self.root_maybe() { + if vm.resolve_behavior().is_none() { + if self + .members() + .filter(|p| p.manifest_path() != root_manifest) + .any(|p| p.manifest().edition() >= Edition::Edition2021) + { + self.config.shell().warn( + "\ + some crates are on edition 2021 which defaults to `resolver = \"2\"`,\n\ + \x20 but a virtual workspace defaults to `resolver = \"1\"`\n\ + \x20 specify the desired resolver version explicitly at the workspace root\ + ", + )?; + } + } + } } Ok(()) } diff --git a/tests/testsuite/features2.rs b/tests/testsuite/features2.rs index 494c83f1e50..188f5bb07e9 100644 --- a/tests/testsuite/features2.rs +++ b/tests/testsuite/features2.rs @@ -1406,6 +1406,41 @@ workspace: [..]/foo/Cargo.toml .run(); } +#[cargo_test] +fn edition_2021_workspace_member() { + let p = project() + .file( + "Cargo.toml", + r#" + [workspace] + members = ["a"] + "#, + ) + .file( + "a/Cargo.toml", + r#" + [package] + name = "a" + version = "0.1.0" + edition = "2021" + "#, + ) + .file("a/src/lib.rs", "") + .build(); + + p.cargo("check") + .with_stderr( + "\ +warning: some crates are on edition 2021 which defaults to `resolver = \"2\"`, + but a virtual workspace defaults to `resolver = \"1\"` + specify the desired resolver version explicitly at the workspace root +[CHECKING] a v0.1.0 [..] +[FINISHED] [..] +", + ) + .run(); +} + #[cargo_test] fn resolver_ws_root_and_member() { // Check when specified in both ws root and member. From 8b8a3a8de5a85039f63b485ad7301df44f3e4206 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 26 May 2023 16:40:41 +0200 Subject: [PATCH 2/7] Detect actual edition/resolver for warning message --- src/cargo/core/workspace.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index c4dc5899ae0..7a0415452c0 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -995,18 +995,21 @@ impl<'cfg> Workspace<'cfg> { } if let MaybePackage::Virtual(vm) = self.root_maybe() { if vm.resolve_behavior().is_none() { - if self + if let Some(edition) = self .members() .filter(|p| p.manifest_path() != root_manifest) - .any(|p| p.manifest().edition() >= Edition::Edition2021) + .map(|p| p.manifest().edition()) + .filter(|&e| e >= Edition::Edition2021) + .max() { + let resolver = edition.default_resolve_behavior().to_manifest(); self.config.shell().warn( - "\ - some crates are on edition 2021 which defaults to `resolver = \"2\"`,\n\ + format_args!("\ + some crates are on edition {edition} which defaults to `resolver = \"{resolver}\"`,\n\ \x20 but a virtual workspace defaults to `resolver = \"1\"`\n\ \x20 specify the desired resolver version explicitly at the workspace root\ ", - )?; + ))?; } } } From 620f66fa922bf7e41fd83dd4eba51394f3493399 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 26 May 2023 16:41:04 +0200 Subject: [PATCH 3/7] Mention workspace root's manifest explicitly --- src/cargo/core/workspace.rs | 2 +- tests/testsuite/features2.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 7a0415452c0..af010d89cac 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -1007,7 +1007,7 @@ impl<'cfg> Workspace<'cfg> { format_args!("\ some crates are on edition {edition} which defaults to `resolver = \"{resolver}\"`,\n\ \x20 but a virtual workspace defaults to `resolver = \"1\"`\n\ - \x20 specify the desired resolver version explicitly at the workspace root\ + \x20 specify the desired resolver version explicitly in the workspace root's manifest\ ", ))?; } diff --git a/tests/testsuite/features2.rs b/tests/testsuite/features2.rs index 188f5bb07e9..9a6a541edb0 100644 --- a/tests/testsuite/features2.rs +++ b/tests/testsuite/features2.rs @@ -1433,7 +1433,7 @@ fn edition_2021_workspace_member() { "\ warning: some crates are on edition 2021 which defaults to `resolver = \"2\"`, but a virtual workspace defaults to `resolver = \"1\"` - specify the desired resolver version explicitly at the workspace root + specify the desired resolver version explicitly in the workspace root's manifest [CHECKING] a v0.1.0 [..] [FINISHED] [..] ", From c31877def5328b61d5f29b4909a6baa9182ce3bc Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 26 May 2023 17:08:31 +0200 Subject: [PATCH 4/7] Update `cargo new` workspace inheritance tests to specify resolver --- tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml | 1 + tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml | 1 + .../cargo_new/inherit_workspace_package_table.in/Cargo.toml | 1 + .../cargo_new/inherit_workspace_package_table/out/Cargo.toml | 1 + .../inherit_workspace_package_table_with_edition/out/Cargo.toml | 1 + .../inherit_workspace_package_table_with_registry/out/Cargo.toml | 1 + 6 files changed, 6 insertions(+) diff --git a/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml index 8c235325c50..55ee0423c7e 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = ["crates/*"] [workspace.lints.rust] diff --git a/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml index 8c235325c50..55ee0423c7e 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = ["crates/*"] [workspace.lints.rust] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] From 7067d0df58feaecf35b315db18b33f2f985704e3 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 26 May 2023 20:09:27 +0200 Subject: [PATCH 5/7] Improve warning message grammar --- src/cargo/core/workspace.rs | 2 +- tests/testsuite/features2.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index af010d89cac..e950dacefe8 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -1006,7 +1006,7 @@ impl<'cfg> Workspace<'cfg> { self.config.shell().warn( format_args!("\ some crates are on edition {edition} which defaults to `resolver = \"{resolver}\"`,\n\ - \x20 but a virtual workspace defaults to `resolver = \"1\"`\n\ + \x20 but virtual workspaces default to `resolver = \"1\"`\n\ \x20 specify the desired resolver version explicitly in the workspace root's manifest\ ", ))?; diff --git a/tests/testsuite/features2.rs b/tests/testsuite/features2.rs index 9a6a541edb0..c599e29cb96 100644 --- a/tests/testsuite/features2.rs +++ b/tests/testsuite/features2.rs @@ -1432,7 +1432,7 @@ fn edition_2021_workspace_member() { .with_stderr( "\ warning: some crates are on edition 2021 which defaults to `resolver = \"2\"`, - but a virtual workspace defaults to `resolver = \"1\"` + but virtual workspaces default to `resolver = \"1\"` specify the desired resolver version explicitly in the workspace root's manifest [CHECKING] a v0.1.0 [..] [FINISHED] [..] From 49cc60b1aac4a1edde394f5f93283ba913de1f77 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 26 May 2023 20:12:41 +0200 Subject: [PATCH 6/7] Add notes on how to configure the virtual workspace's resolver --- src/cargo/core/workspace.rs | 4 ++++ tests/testsuite/features2.rs | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index e950dacefe8..76ec21cf68a 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -1010,6 +1010,10 @@ impl<'cfg> Workspace<'cfg> { \x20 specify the desired resolver version explicitly in the workspace root's manifest\ ", ))?; + self.config.shell().note( + "to keep the current resolver, specify `workspace.resolver = \"1\"`", + )?; + self.config.shell().note(format_args!("to use the edition {edition} resolver, specify `workspace.resolver = \"{resolver}\"`"))?; } } } diff --git a/tests/testsuite/features2.rs b/tests/testsuite/features2.rs index c599e29cb96..a5ae8230908 100644 --- a/tests/testsuite/features2.rs +++ b/tests/testsuite/features2.rs @@ -1434,6 +1434,8 @@ fn edition_2021_workspace_member() { warning: some crates are on edition 2021 which defaults to `resolver = \"2\"`, but virtual workspaces default to `resolver = \"1\"` specify the desired resolver version explicitly in the workspace root's manifest +note: to keep the current resolver, specify `workspace.resolver = \"1\"` +note: to use the edition 2021 resolver, specify `workspace.resolver = \"2\"` [CHECKING] a v0.1.0 [..] [FINISHED] [..] ", From 3dec6f234d58d5b2f8197029fcba69ce77bd2ca6 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 26 May 2023 20:27:34 +0200 Subject: [PATCH 7/7] Remove unnecessary warning line --- src/cargo/core/workspace.rs | 12 +++--------- tests/testsuite/features2.rs | 8 +++----- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 76ec21cf68a..702c1929a69 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -1003,17 +1003,11 @@ impl<'cfg> Workspace<'cfg> { .max() { let resolver = edition.default_resolve_behavior().to_manifest(); - self.config.shell().warn( - format_args!("\ - some crates are on edition {edition} which defaults to `resolver = \"{resolver}\"`,\n\ - \x20 but virtual workspaces default to `resolver = \"1\"`\n\ - \x20 specify the desired resolver version explicitly in the workspace root's manifest\ - ", - ))?; + self.config.shell().warn(format_args!("some crates are on edition {edition} which defaults to `resolver = \"{resolver}\"`, but virtual workspaces default to `resolver = \"1\"`"))?; self.config.shell().note( - "to keep the current resolver, specify `workspace.resolver = \"1\"`", + "to keep the current resolver, specify `workspace.resolver = \"1\"` in the workspace root's manifest", )?; - self.config.shell().note(format_args!("to use the edition {edition} resolver, specify `workspace.resolver = \"{resolver}\"`"))?; + self.config.shell().note(format_args!("to use the edition {edition} resolver, specify `workspace.resolver = \"{resolver}\"` in the workspace root's manifest"))?; } } } diff --git a/tests/testsuite/features2.rs b/tests/testsuite/features2.rs index a5ae8230908..68fecb863a8 100644 --- a/tests/testsuite/features2.rs +++ b/tests/testsuite/features2.rs @@ -1431,11 +1431,9 @@ fn edition_2021_workspace_member() { p.cargo("check") .with_stderr( "\ -warning: some crates are on edition 2021 which defaults to `resolver = \"2\"`, - but virtual workspaces default to `resolver = \"1\"` - specify the desired resolver version explicitly in the workspace root's manifest -note: to keep the current resolver, specify `workspace.resolver = \"1\"` -note: to use the edition 2021 resolver, specify `workspace.resolver = \"2\"` +warning: some crates are on edition 2021 which defaults to `resolver = \"2\"`, but virtual workspaces default to `resolver = \"1\"` +note: to keep the current resolver, specify `workspace.resolver = \"1\"` in the workspace root's manifest +note: to use the edition 2021 resolver, specify `workspace.resolver = \"2\"` in the workspace root's manifest [CHECKING] a v0.1.0 [..] [FINISHED] [..] ",