Skip to content

Commit 1fcbca8

Browse files
committed
Auto merge of #10961 - Nemo157:skip-implicit-override, r=epage
Only override published resolver when the workspace is different ### What does this PR try to resolve? Ensures when publishing a package that uses an implicit `resolver = "1"` to maintain an MSRV before the `resolver` key was stabilized the implicitness is retained rather than being turned into an explicit setting. fixes #10954 (assuming that the workspace and its packages are configured with a consistent resolver)
2 parents fcf3281 + 492358a commit 1fcbca8

File tree

8 files changed

+66
-26
lines changed

8 files changed

+66
-26
lines changed

src/cargo/core/features.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ use anyhow::{bail, Error};
102102
use cargo_util::ProcessBuilder;
103103
use serde::{Deserialize, Serialize};
104104

105+
use crate::core::resolver::ResolveBehavior;
105106
use crate::util::errors::CargoResult;
106107
use crate::util::{indented_lines, iter_join};
107108
use crate::Config;
@@ -242,6 +243,14 @@ impl Edition {
242243
Edition2021 => false,
243244
}
244245
}
246+
247+
pub(crate) fn default_resolve_behavior(&self) -> ResolveBehavior {
248+
if *self >= Edition::Edition2021 {
249+
ResolveBehavior::V2
250+
} else {
251+
ResolveBehavior::V1
252+
}
253+
}
245254
}
246255

247256
impl fmt::Display for Edition {

src/cargo/core/workspace.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::core::features::Features;
1616
use crate::core::registry::PackageRegistry;
1717
use crate::core::resolver::features::CliFeatures;
1818
use crate::core::resolver::ResolveBehavior;
19-
use crate::core::{Dependency, Edition, FeatureValue, PackageId, PackageIdSpec};
19+
use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec};
2020
use crate::core::{EitherManifest, Package, SourceId, VirtualManifest};
2121
use crate::ops;
2222
use crate::sources::{PathSource, CRATES_IO_INDEX, CRATES_IO_REGISTRY};
@@ -287,16 +287,12 @@ impl<'cfg> Workspace<'cfg> {
287287
// - If the root package specifies edition 2021, use v2.
288288
// - Otherwise, use the default v1.
289289
self.resolve_behavior = match self.root_maybe() {
290-
MaybePackage::Package(p) => p.manifest().resolve_behavior().or_else(|| {
291-
if p.manifest().edition() >= Edition::Edition2021 {
292-
Some(ResolveBehavior::V2)
293-
} else {
294-
None
295-
}
296-
}),
297-
MaybePackage::Virtual(vm) => vm.resolve_behavior(),
290+
MaybePackage::Package(p) => p
291+
.manifest()
292+
.resolve_behavior()
293+
.unwrap_or_else(|| p.manifest().edition().default_resolve_behavior()),
294+
MaybePackage::Virtual(vm) => vm.resolve_behavior().unwrap_or(ResolveBehavior::V1),
298295
}
299-
.unwrap_or(ResolveBehavior::V1);
300296
}
301297

302298
/// Returns the current package of this workspace.

src/cargo/util/toml/mod.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::fmt;
33
use std::marker::PhantomData;
44
use std::path::{Path, PathBuf};
55
use std::rc::Rc;
6-
use std::str;
6+
use std::str::{self, FromStr};
77

88
use anyhow::{anyhow, bail, Context as _};
99
use cargo_platform::Platform;
@@ -1342,7 +1342,26 @@ impl TomlManifest {
13421342
.unwrap()
13431343
.clone();
13441344
package.workspace = None;
1345-
package.resolver = Some(ws.resolve_behavior().to_manifest());
1345+
let current_resolver = package
1346+
.resolver
1347+
.as_ref()
1348+
.map(|r| ResolveBehavior::from_manifest(r))
1349+
.unwrap_or_else(|| {
1350+
package
1351+
.edition
1352+
.as_ref()
1353+
.and_then(|e| e.as_defined())
1354+
.map(|e| Edition::from_str(e))
1355+
.unwrap_or(Ok(Edition::Edition2015))
1356+
.map(|e| e.default_resolve_behavior())
1357+
})?;
1358+
if ws.resolve_behavior() != current_resolver {
1359+
// This ensures the published crate if built as a root (e.g. `cargo install`) will
1360+
// use the same resolver behavior it was tested with in the workspace.
1361+
// To avoid forcing a higher MSRV we don't explicitly set this if it would implicitly
1362+
// result in the same thing.
1363+
package.resolver = Some(ws.resolve_behavior().to_manifest());
1364+
}
13461365
if let Some(license_file) = &package.license_file {
13471366
let license_file = license_file
13481367
.as_defined()

tests/testsuite/features_namespaced.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,6 @@ version = "0.1.0"
951951
description = "foo"
952952
homepage = "https://example.com/"
953953
license = "MIT"
954-
resolver = "1"
955954
956955
[dependencies.opt-dep1]
957956
version = "1.0"
@@ -1059,7 +1058,6 @@ version = "0.1.0"
10591058
description = "foo"
10601059
homepage = "https://example.com/"
10611060
license = "MIT"
1062-
resolver = "1"
10631061
10641062
[dependencies.bar]
10651063
version = "1.0"

tests/testsuite/inheritable_workspace_fields.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,6 @@ keywords = ["cli"]
218218
categories = ["development-tools"]
219219
license = "MIT"
220220
repository = "https://github.com/example/example"
221-
resolver = "1"
222221
223222
[badges.gitlab]
224223
branch = "master"
@@ -349,7 +348,6 @@ fn inherit_own_dependencies() {
349348
name = "bar"
350349
version = "0.2.0"
351350
authors = []
352-
resolver = "1"
353351
354352
[dependencies.dep]
355353
version = "0.1"
@@ -454,7 +452,6 @@ fn inherit_own_detailed_dependencies() {
454452
name = "bar"
455453
version = "0.2.0"
456454
authors = []
457-
resolver = "1"
458455
459456
[dependencies.dep]
460457
version = "0.1.2"
@@ -691,7 +688,6 @@ categories = ["development-tools"]
691688
license = "MIT"
692689
license-file = "LICENSE"
693690
repository = "https://github.com/example/example"
694-
resolver = "1"
695691
696692
[badges.gitlab]
697693
branch = "master"
@@ -823,7 +819,6 @@ fn inherit_dependencies() {
823819
name = "bar"
824820
version = "0.2.0"
825821
authors = []
826-
resolver = "1"
827822
828823
[dependencies.dep]
829824
version = "0.1"

tests/testsuite/package.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,7 +1119,6 @@ authors = []
11191119
exclude = ["*.txt"]
11201120
description = "foo"
11211121
license = "MIT"
1122-
resolver = "1"
11231122
11241123
[package.metadata]
11251124
foo = "bar"
@@ -1190,7 +1189,6 @@ fn ignore_workspace_specifier() {
11901189
name = "bar"
11911190
version = "0.1.0"
11921191
authors = []
1193-
resolver = "1"
11941192
"#,
11951193
cargo::core::package::MANIFEST_PREAMBLE
11961194
);
@@ -2341,7 +2339,7 @@ fn workspace_overrides_resolver() {
23412339
"Cargo.toml",
23422340
r#"
23432341
[workspace]
2344-
members = ["bar"]
2342+
members = ["bar", "baz"]
23452343
"#,
23462344
)
23472345
.file(
@@ -2354,9 +2352,19 @@ fn workspace_overrides_resolver() {
23542352
"#,
23552353
)
23562354
.file("bar/src/lib.rs", "")
2355+
.file(
2356+
"baz/Cargo.toml",
2357+
r#"
2358+
[package]
2359+
name = "baz"
2360+
version = "0.1.0"
2361+
edition = "2015"
2362+
"#,
2363+
)
2364+
.file("baz/src/lib.rs", "")
23572365
.build();
23582366

2359-
p.cargo("package --no-verify").cwd("bar").run();
2367+
p.cargo("package --no-verify -p bar -p baz").run();
23602368

23612369
let f = File::open(&p.root().join("target/package/bar-0.1.0.crate")).unwrap();
23622370
let rewritten_toml = format!(
@@ -2375,4 +2383,22 @@ resolver = "1"
23752383
&["Cargo.toml", "Cargo.toml.orig", "src/lib.rs"],
23762384
&[("Cargo.toml", &rewritten_toml)],
23772385
);
2386+
2387+
// When the crate has the same implicit resolver as the workspace it is not overridden
2388+
let f = File::open(&p.root().join("target/package/baz-0.1.0.crate")).unwrap();
2389+
let rewritten_toml = format!(
2390+
r#"{}
2391+
[package]
2392+
edition = "2015"
2393+
name = "baz"
2394+
version = "0.1.0"
2395+
"#,
2396+
cargo::core::package::MANIFEST_PREAMBLE
2397+
);
2398+
validate_crate_contents(
2399+
f,
2400+
"baz-0.1.0.crate",
2401+
&["Cargo.toml", "Cargo.toml.orig", "src/lib.rs"],
2402+
&[("Cargo.toml", &rewritten_toml)],
2403+
);
23782404
}

tests/testsuite/publish.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,7 +1178,6 @@ fn publish_git_with_version() {
11781178
authors = []\n\
11791179
description = \"foo\"\n\
11801180
license = \"MIT\"\n\
1181-
resolver = \"1\"\n\
11821181
\n\
11831182
[dependencies.dep1]\n\
11841183
version = \"1.0\"\n\
@@ -1285,7 +1284,6 @@ homepage = "foo"
12851284
documentation = "foo"
12861285
license = "MIT"
12871286
repository = "foo"
1288-
resolver = "1"
12891287
12901288
[dev-dependencies]
12911289
"#,

tests/testsuite/weak_dep_features.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,6 @@ version = "0.1.0"
608608
description = "foo"
609609
homepage = "https://example.com/"
610610
license = "MIT"
611-
resolver = "1"
612611
613612
[dependencies.bar]
614613
version = "1.0"

0 commit comments

Comments
 (0)