From df0c64ebc12c582e7279be393d7fdf87278806bc Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 29 Jul 2022 12:07:27 +0200 Subject: [PATCH 1/2] Have `Edition` know what its default resolver behaviour is --- src/cargo/core/features.rs | 9 +++++++++ src/cargo/core/workspace.rs | 16 ++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/cargo/core/features.rs b/src/cargo/core/features.rs index 0400e89a1e4..e8de1dac6a8 100644 --- a/src/cargo/core/features.rs +++ b/src/cargo/core/features.rs @@ -102,6 +102,7 @@ use anyhow::{bail, Error}; use cargo_util::ProcessBuilder; use serde::{Deserialize, Serialize}; +use crate::core::resolver::ResolveBehavior; use crate::util::errors::CargoResult; use crate::util::{indented_lines, iter_join}; use crate::Config; @@ -242,6 +243,14 @@ impl Edition { Edition2021 => false, } } + + pub(crate) fn default_resolve_behavior(&self) -> ResolveBehavior { + if *self >= Edition::Edition2021 { + ResolveBehavior::V2 + } else { + ResolveBehavior::V1 + } + } } impl fmt::Display for Edition { diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 2adf13a5b1a..0d07dafa347 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -16,7 +16,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, Edition, FeatureValue, PackageId, PackageIdSpec}; +use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec}; use crate::core::{EitherManifest, Package, SourceId, VirtualManifest}; use crate::ops; use crate::sources::{PathSource, CRATES_IO_INDEX, CRATES_IO_REGISTRY}; @@ -287,16 +287,12 @@ impl<'cfg> Workspace<'cfg> { // - If the root package specifies edition 2021, use v2. // - Otherwise, use the default v1. self.resolve_behavior = match self.root_maybe() { - MaybePackage::Package(p) => p.manifest().resolve_behavior().or_else(|| { - if p.manifest().edition() >= Edition::Edition2021 { - Some(ResolveBehavior::V2) - } else { - None - } - }), - MaybePackage::Virtual(vm) => vm.resolve_behavior(), + MaybePackage::Package(p) => p + .manifest() + .resolve_behavior() + .unwrap_or_else(|| p.manifest().edition().default_resolve_behavior()), + MaybePackage::Virtual(vm) => vm.resolve_behavior().unwrap_or(ResolveBehavior::V1), } - .unwrap_or(ResolveBehavior::V1); } /// Returns the current package of this workspace. From 492358a19f7bb14d66fe3fabbe3c8b8f54f7d39c Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 29 Jul 2022 12:07:27 +0200 Subject: [PATCH 2/2] Only override published resolver when the workspace is different --- src/cargo/util/toml/mod.rs | 23 +++++++++++-- tests/testsuite/features_namespaced.rs | 2 -- .../testsuite/inheritable_workspace_fields.rs | 5 --- tests/testsuite/package.rs | 34 ++++++++++++++++--- tests/testsuite/publish.rs | 2 -- tests/testsuite/weak_dep_features.rs | 1 - 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 58647e03f05..507d6e790a7 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -3,7 +3,7 @@ use std::fmt; use std::marker::PhantomData; use std::path::{Path, PathBuf}; use std::rc::Rc; -use std::str; +use std::str::{self, FromStr}; use anyhow::{anyhow, bail, Context as _}; use cargo_platform::Platform; @@ -1342,7 +1342,26 @@ impl TomlManifest { .unwrap() .clone(); package.workspace = None; - package.resolver = Some(ws.resolve_behavior().to_manifest()); + let current_resolver = package + .resolver + .as_ref() + .map(|r| ResolveBehavior::from_manifest(r)) + .unwrap_or_else(|| { + package + .edition + .as_ref() + .and_then(|e| e.as_defined()) + .map(|e| Edition::from_str(e)) + .unwrap_or(Ok(Edition::Edition2015)) + .map(|e| e.default_resolve_behavior()) + })?; + if ws.resolve_behavior() != current_resolver { + // This ensures the published crate if built as a root (e.g. `cargo install`) will + // use the same resolver behavior it was tested with in the workspace. + // To avoid forcing a higher MSRV we don't explicitly set this if it would implicitly + // result in the same thing. + package.resolver = Some(ws.resolve_behavior().to_manifest()); + } if let Some(license_file) = &package.license_file { let license_file = license_file .as_defined() diff --git a/tests/testsuite/features_namespaced.rs b/tests/testsuite/features_namespaced.rs index c1f422a6b5f..0fe1c964bc1 100644 --- a/tests/testsuite/features_namespaced.rs +++ b/tests/testsuite/features_namespaced.rs @@ -951,7 +951,6 @@ version = "0.1.0" description = "foo" homepage = "https://example.com/" license = "MIT" -resolver = "1" [dependencies.opt-dep1] version = "1.0" @@ -1059,7 +1058,6 @@ version = "0.1.0" description = "foo" homepage = "https://example.com/" license = "MIT" -resolver = "1" [dependencies.bar] version = "1.0" diff --git a/tests/testsuite/inheritable_workspace_fields.rs b/tests/testsuite/inheritable_workspace_fields.rs index 07661d72d59..9f136453665 100644 --- a/tests/testsuite/inheritable_workspace_fields.rs +++ b/tests/testsuite/inheritable_workspace_fields.rs @@ -218,7 +218,6 @@ keywords = ["cli"] categories = ["development-tools"] license = "MIT" repository = "https://github.com/example/example" -resolver = "1" [badges.gitlab] branch = "master" @@ -349,7 +348,6 @@ fn inherit_own_dependencies() { name = "bar" version = "0.2.0" authors = [] -resolver = "1" [dependencies.dep] version = "0.1" @@ -454,7 +452,6 @@ fn inherit_own_detailed_dependencies() { name = "bar" version = "0.2.0" authors = [] -resolver = "1" [dependencies.dep] version = "0.1.2" @@ -691,7 +688,6 @@ categories = ["development-tools"] license = "MIT" license-file = "LICENSE" repository = "https://github.com/example/example" -resolver = "1" [badges.gitlab] branch = "master" @@ -823,7 +819,6 @@ fn inherit_dependencies() { name = "bar" version = "0.2.0" authors = [] -resolver = "1" [dependencies.dep] version = "0.1" diff --git a/tests/testsuite/package.rs b/tests/testsuite/package.rs index 63e384af88e..f1fcda33671 100644 --- a/tests/testsuite/package.rs +++ b/tests/testsuite/package.rs @@ -1119,7 +1119,6 @@ authors = [] exclude = ["*.txt"] description = "foo" license = "MIT" -resolver = "1" [package.metadata] foo = "bar" @@ -1190,7 +1189,6 @@ fn ignore_workspace_specifier() { name = "bar" version = "0.1.0" authors = [] -resolver = "1" "#, cargo::core::package::MANIFEST_PREAMBLE ); @@ -2341,7 +2339,7 @@ fn workspace_overrides_resolver() { "Cargo.toml", r#" [workspace] - members = ["bar"] + members = ["bar", "baz"] "#, ) .file( @@ -2354,9 +2352,19 @@ fn workspace_overrides_resolver() { "#, ) .file("bar/src/lib.rs", "") + .file( + "baz/Cargo.toml", + r#" + [package] + name = "baz" + version = "0.1.0" + edition = "2015" + "#, + ) + .file("baz/src/lib.rs", "") .build(); - p.cargo("package --no-verify").cwd("bar").run(); + p.cargo("package --no-verify -p bar -p baz").run(); let f = File::open(&p.root().join("target/package/bar-0.1.0.crate")).unwrap(); let rewritten_toml = format!( @@ -2375,4 +2383,22 @@ resolver = "1" &["Cargo.toml", "Cargo.toml.orig", "src/lib.rs"], &[("Cargo.toml", &rewritten_toml)], ); + + // When the crate has the same implicit resolver as the workspace it is not overridden + let f = File::open(&p.root().join("target/package/baz-0.1.0.crate")).unwrap(); + let rewritten_toml = format!( + r#"{} +[package] +edition = "2015" +name = "baz" +version = "0.1.0" +"#, + cargo::core::package::MANIFEST_PREAMBLE + ); + validate_crate_contents( + f, + "baz-0.1.0.crate", + &["Cargo.toml", "Cargo.toml.orig", "src/lib.rs"], + &[("Cargo.toml", &rewritten_toml)], + ); } diff --git a/tests/testsuite/publish.rs b/tests/testsuite/publish.rs index 3c72b941d12..77de699f6c7 100644 --- a/tests/testsuite/publish.rs +++ b/tests/testsuite/publish.rs @@ -1178,7 +1178,6 @@ fn publish_git_with_version() { authors = []\n\ description = \"foo\"\n\ license = \"MIT\"\n\ - resolver = \"1\"\n\ \n\ [dependencies.dep1]\n\ version = \"1.0\"\n\ @@ -1285,7 +1284,6 @@ homepage = "foo" documentation = "foo" license = "MIT" repository = "foo" -resolver = "1" [dev-dependencies] "#, diff --git a/tests/testsuite/weak_dep_features.rs b/tests/testsuite/weak_dep_features.rs index 0db7bb9c21e..07d86470081 100644 --- a/tests/testsuite/weak_dep_features.rs +++ b/tests/testsuite/weak_dep_features.rs @@ -608,7 +608,6 @@ version = "0.1.0" description = "foo" homepage = "https://example.com/" license = "MIT" -resolver = "1" [dependencies.bar] version = "1.0"