@@ -26,7 +26,10 @@ use crate::util::errors::{CargoResult, ManifestError};
26
26
use crate :: util:: interning:: InternedString ;
27
27
use crate :: util:: lints:: check_implicit_features;
28
28
use crate :: util:: toml:: { read_manifest, InheritableFields } ;
29
- use crate :: util:: { context:: ConfigRelativePath , Filesystem , GlobalContext , IntoUrl } ;
29
+ use crate :: util:: {
30
+ context:: CargoResolverConfig , context:: CargoResolverPrecedence , context:: ConfigRelativePath ,
31
+ Filesystem , GlobalContext , IntoUrl ,
32
+ } ;
30
33
use cargo_util:: paths;
31
34
use cargo_util:: paths:: normalize_path;
32
35
use cargo_util_schemas:: manifest;
@@ -100,6 +103,7 @@ pub struct Workspace<'gctx> {
100
103
101
104
/// The resolver behavior specified with the `resolver` field.
102
105
resolve_behavior : ResolveBehavior ,
106
+ resolve_honors_rust_version : bool ,
103
107
honor_rust_version : Option < bool > ,
104
108
105
109
/// Workspace-level custom metadata
@@ -207,7 +211,7 @@ impl<'gctx> Workspace<'gctx> {
207
211
. load_workspace_config ( ) ?
208
212
. and_then ( |cfg| cfg. custom_metadata ) ;
209
213
ws. find_members ( ) ?;
210
- ws. set_resolve_behavior ( ) ;
214
+ ws. set_resolve_behavior ( ) ? ;
211
215
ws. validate ( ) ?;
212
216
Ok ( ws)
213
217
}
@@ -230,6 +234,7 @@ impl<'gctx> Workspace<'gctx> {
230
234
loaded_packages : RefCell :: new ( HashMap :: new ( ) ) ,
231
235
ignore_lock : false ,
232
236
resolve_behavior : ResolveBehavior :: V1 ,
237
+ resolve_honors_rust_version : false ,
233
238
honor_rust_version : None ,
234
239
custom_metadata : None ,
235
240
}
@@ -248,7 +253,7 @@ impl<'gctx> Workspace<'gctx> {
248
253
. packages
249
254
. insert ( root_path, MaybePackage :: Virtual ( manifest) ) ;
250
255
ws. find_members ( ) ?;
251
- ws. set_resolve_behavior ( ) ;
256
+ ws. set_resolve_behavior ( ) ? ;
252
257
// TODO: validation does not work because it walks up the directory
253
258
// tree looking for the root which is a fake file that doesn't exist.
254
259
Ok ( ws)
@@ -284,11 +289,11 @@ impl<'gctx> Workspace<'gctx> {
284
289
ws. members . push ( ws. current_manifest . clone ( ) ) ;
285
290
ws. member_ids . insert ( id) ;
286
291
ws. default_members . push ( ws. current_manifest . clone ( ) ) ;
287
- ws. set_resolve_behavior ( ) ;
292
+ ws. set_resolve_behavior ( ) ? ;
288
293
Ok ( ws)
289
294
}
290
295
291
- fn set_resolve_behavior ( & mut self ) {
296
+ fn set_resolve_behavior ( & mut self ) -> CargoResult < ( ) > {
292
297
// - If resolver is specified in the workspace definition, use that.
293
298
// - If the root package specifies the resolver, use that.
294
299
// - If the root package specifies edition 2021, use v2.
@@ -299,7 +304,36 @@ impl<'gctx> Workspace<'gctx> {
299
304
. resolve_behavior ( )
300
305
. unwrap_or_else ( || p. manifest ( ) . edition ( ) . default_resolve_behavior ( ) ) ,
301
306
MaybePackage :: Virtual ( vm) => vm. resolve_behavior ( ) . unwrap_or ( ResolveBehavior :: V1 ) ,
307
+ } ;
308
+
309
+ match self . gctx ( ) . get :: < CargoResolverConfig > ( "resolver" ) {
310
+ Ok ( CargoResolverConfig {
311
+ something_like_precedence : Some ( precedence) ,
312
+ } ) => {
313
+ if self . gctx ( ) . cli_unstable ( ) . msrv_policy {
314
+ self . resolve_honors_rust_version =
315
+ precedence == CargoResolverPrecedence :: SomethingLikeRustVersion ;
316
+ } else {
317
+ self . gctx ( )
318
+ . shell ( )
319
+ . warn ( "ignoring `resolver` config table without `-Zmsrv-policy`" ) ?;
320
+ }
321
+ }
322
+ Ok ( CargoResolverConfig {
323
+ something_like_precedence : None ,
324
+ } ) => { }
325
+ Err ( err) => {
326
+ if self . gctx ( ) . cli_unstable ( ) . msrv_policy {
327
+ return Err ( err) ;
328
+ } else {
329
+ self . gctx ( )
330
+ . shell ( )
331
+ . warn ( "ignoring `resolver` config table without `-Zmsrv-policy`" ) ?;
332
+ }
333
+ }
302
334
}
335
+
336
+ Ok ( ( ) )
303
337
}
304
338
305
339
/// Returns the current package of this workspace.
@@ -616,7 +650,9 @@ impl<'gctx> Workspace<'gctx> {
616
650
}
617
651
618
652
pub fn resolve_honors_rust_version ( & self ) -> bool {
619
- self . gctx ( ) . cli_unstable ( ) . msrv_policy && self . honor_rust_version . unwrap_or ( true )
653
+ // Give CLI precedence
654
+ self . honor_rust_version
655
+ . unwrap_or ( self . resolve_honors_rust_version )
620
656
}
621
657
622
658
pub fn custom_metadata ( & self ) -> Option < & toml:: Value > {
0 commit comments