Skip to content

Commit 51aaf35

Browse files
committed
Only override resolver when the workspace is different
1 parent 288f087 commit 51aaf35

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

src/cargo/core/features.rs

+9
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

+6-10
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+
.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

+17-2
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,22 @@ 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+
.transpose()
1356+
.map(|e| e.unwrap_or(Edition::Edition2015).default_resolve_behavior())
1357+
})?;
1358+
if ws.resolve_behavior() != current_resolver {
1359+
package.resolver = Some(ws.resolve_behavior().to_manifest());
1360+
}
13461361
if let Some(license_file) = &package.license_file {
13471362
let license_file = license_file
13481363
.as_defined()

0 commit comments

Comments
 (0)