@@ -13,7 +13,7 @@ use crate::core::features::Features;
13
13
use crate :: core:: registry:: PackageRegistry ;
14
14
use crate :: core:: resolver:: features:: RequestedFeatures ;
15
15
use crate :: core:: resolver:: ResolveBehavior ;
16
- use crate :: core:: { Dependency , PackageId , PackageIdSpec } ;
16
+ use crate :: core:: { Dependency , Edition , PackageId , PackageIdSpec } ;
17
17
use crate :: core:: { EitherManifest , Package , SourceId , VirtualManifest } ;
18
18
use crate :: ops;
19
19
use crate :: sources:: PathSource ;
@@ -88,7 +88,7 @@ pub struct Workspace<'cfg> {
88
88
ignore_lock : bool ,
89
89
90
90
/// The resolver behavior specified with the `resolver` field.
91
- resolve_behavior : Option < ResolveBehavior > ,
91
+ resolve_behavior : ResolveBehavior ,
92
92
93
93
/// Workspace-level custom metadata
94
94
custom_metadata : Option < toml:: Value > ,
@@ -164,10 +164,7 @@ impl<'cfg> Workspace<'cfg> {
164
164
. load_workspace_config ( ) ?
165
165
. and_then ( |cfg| cfg. custom_metadata ) ;
166
166
ws. find_members ( ) ?;
167
- ws. resolve_behavior = match ws. root_maybe ( ) {
168
- MaybePackage :: Package ( p) => p. manifest ( ) . resolve_behavior ( ) ,
169
- MaybePackage :: Virtual ( vm) => vm. resolve_behavior ( ) ,
170
- } ;
167
+ ws. set_resolve_behavior ( ) ;
171
168
ws. validate ( ) ?;
172
169
Ok ( ws)
173
170
}
@@ -189,7 +186,7 @@ impl<'cfg> Workspace<'cfg> {
189
186
require_optional_deps : true ,
190
187
loaded_packages : RefCell :: new ( HashMap :: new ( ) ) ,
191
188
ignore_lock : false ,
192
- resolve_behavior : None ,
189
+ resolve_behavior : ResolveBehavior :: V1 ,
193
190
custom_metadata : None ,
194
191
}
195
192
}
@@ -203,11 +200,11 @@ impl<'cfg> Workspace<'cfg> {
203
200
let mut ws = Workspace :: new_default ( current_manifest, config) ;
204
201
ws. root_manifest = Some ( root_path. join ( "Cargo.toml" ) ) ;
205
202
ws. target_dir = config. target_dir ( ) ?;
206
- ws. resolve_behavior = manifest. resolve_behavior ( ) ;
207
203
ws. packages
208
204
. packages
209
205
. insert ( root_path, MaybePackage :: Virtual ( manifest) ) ;
210
206
ws. find_members ( ) ?;
207
+ ws. set_resolve_behavior ( ) ;
211
208
// TODO: validation does not work because it walks up the directory
212
209
// tree looking for the root which is a fake file that doesn't exist.
213
210
Ok ( ws)
@@ -231,7 +228,6 @@ impl<'cfg> Workspace<'cfg> {
231
228
let mut ws = Workspace :: new_default ( package. manifest_path ( ) . to_path_buf ( ) , config) ;
232
229
ws. is_ephemeral = true ;
233
230
ws. require_optional_deps = require_optional_deps;
234
- ws. resolve_behavior = package. manifest ( ) . resolve_behavior ( ) ;
235
231
let key = ws. current_manifest . parent ( ) . unwrap ( ) ;
236
232
let id = package. package_id ( ) ;
237
233
let package = MaybePackage :: Package ( package) ;
@@ -244,9 +240,28 @@ impl<'cfg> Workspace<'cfg> {
244
240
ws. members . push ( ws. current_manifest . clone ( ) ) ;
245
241
ws. member_ids . insert ( id) ;
246
242
ws. default_members . push ( ws. current_manifest . clone ( ) ) ;
243
+ ws. set_resolve_behavior ( ) ;
247
244
Ok ( ws)
248
245
}
249
246
247
+ fn set_resolve_behavior ( & mut self ) {
248
+ // - If resolver is specified in the workspace definition, use that.
249
+ // - If the root package specifies the resolver, use that.
250
+ // - If the root package specifies edition 2021, use v2.
251
+ // - Otherwise, use the default v1.
252
+ self . resolve_behavior = match self . root_maybe ( ) {
253
+ MaybePackage :: Package ( p) => p. manifest ( ) . resolve_behavior ( ) . or_else ( || {
254
+ if p. manifest ( ) . edition ( ) >= Edition :: Edition2021 {
255
+ Some ( ResolveBehavior :: V2 )
256
+ } else {
257
+ None
258
+ }
259
+ } ) ,
260
+ MaybePackage :: Virtual ( vm) => vm. resolve_behavior ( ) ,
261
+ }
262
+ . unwrap_or ( ResolveBehavior :: V1 ) ;
263
+ }
264
+
250
265
/// Returns the current package of this workspace.
251
266
///
252
267
/// Note that this can return an error if it the current manifest is
@@ -634,7 +649,7 @@ impl<'cfg> Workspace<'cfg> {
634
649
}
635
650
636
651
pub fn resolve_behavior ( & self ) -> ResolveBehavior {
637
- self . resolve_behavior . unwrap_or ( ResolveBehavior :: V1 )
652
+ self . resolve_behavior
638
653
}
639
654
640
655
/// Returns `true` if this workspace uses the new CLI features behavior.
@@ -843,11 +858,11 @@ impl<'cfg> Workspace<'cfg> {
843
858
if !manifest. patch ( ) . is_empty ( ) {
844
859
emit_warning ( "patch" ) ?;
845
860
}
846
- if manifest. resolve_behavior ( ) . is_some ( )
847
- && manifest . resolve_behavior ( ) != self . resolve_behavior
848
- {
849
- // Only warn if they don't match.
850
- emit_warning ( "resolver" ) ? ;
861
+ if let Some ( behavior ) = manifest. resolve_behavior ( ) {
862
+ if behavior != self . resolve_behavior {
863
+ // Only warn if they don't match.
864
+ emit_warning ( "resolver" ) ? ;
865
+ }
851
866
}
852
867
}
853
868
}
0 commit comments