@@ -237,13 +237,9 @@ impl<'cfg> Workspace<'cfg> {
237
237
}
238
238
239
239
pub fn profiles ( & self ) -> & Profiles {
240
- let root = self
241
- . root_manifest
242
- . as_ref ( )
243
- . unwrap_or ( & self . current_manifest ) ;
244
- match * self . packages . get ( root) {
245
- MaybePackage :: Package ( ref p) => p. manifest ( ) . profiles ( ) ,
246
- MaybePackage :: Virtual ( ref vm) => vm. profiles ( ) ,
240
+ match self . root_maybe ( ) {
241
+ MaybePackage :: Package ( p) => p. manifest ( ) . profiles ( ) ,
242
+ MaybePackage :: Virtual ( vm) => vm. profiles ( ) ,
247
243
}
248
244
}
249
245
@@ -260,6 +256,15 @@ impl<'cfg> Workspace<'cfg> {
260
256
. unwrap ( )
261
257
}
262
258
259
+ /// Returns the root Package or VirtualManifest.
260
+ fn root_maybe ( & self ) -> & MaybePackage {
261
+ let root = self
262
+ . root_manifest
263
+ . as_ref ( )
264
+ . unwrap_or ( & self . current_manifest ) ;
265
+ self . packages . get ( root)
266
+ }
267
+
263
268
pub fn target_dir ( & self ) -> Filesystem {
264
269
self . target_dir
265
270
. clone ( )
@@ -270,27 +275,19 @@ impl<'cfg> Workspace<'cfg> {
270
275
///
271
276
/// This may be from a virtual crate or an actual crate.
272
277
pub fn root_replace ( & self ) -> & [ ( PackageIdSpec , Dependency ) ] {
273
- let path = match self . root_manifest {
274
- Some ( ref p) => p,
275
- None => & self . current_manifest ,
276
- } ;
277
- match * self . packages . get ( path) {
278
- MaybePackage :: Package ( ref p) => p. manifest ( ) . replace ( ) ,
279
- MaybePackage :: Virtual ( ref vm) => vm. replace ( ) ,
278
+ match self . root_maybe ( ) {
279
+ MaybePackage :: Package ( p) => p. manifest ( ) . replace ( ) ,
280
+ MaybePackage :: Virtual ( vm) => vm. replace ( ) ,
280
281
}
281
282
}
282
283
283
284
/// Returns the root [patch] section of this workspace.
284
285
///
285
286
/// This may be from a virtual crate or an actual crate.
286
287
pub fn root_patch ( & self ) -> & HashMap < Url , Vec < Dependency > > {
287
- let path = match self . root_manifest {
288
- Some ( ref p) => p,
289
- None => & self . current_manifest ,
290
- } ;
291
- match * self . packages . get ( path) {
292
- MaybePackage :: Package ( ref p) => p. manifest ( ) . patch ( ) ,
293
- MaybePackage :: Virtual ( ref vm) => vm. patch ( ) ,
288
+ match self . root_maybe ( ) {
289
+ MaybePackage :: Package ( p) => p. manifest ( ) . patch ( ) ,
290
+ MaybePackage :: Virtual ( vm) => vm. patch ( ) ,
294
291
}
295
292
}
296
293
@@ -524,6 +521,18 @@ impl<'cfg> Workspace<'cfg> {
524
521
/// 2. All workspace members agree on this one root as the root.
525
522
/// 3. The current crate is a member of this workspace.
526
523
fn validate ( & mut self ) -> CargoResult < ( ) > {
524
+ // Validate config profiles only once per workspace.
525
+ let features = match self . root_maybe ( ) {
526
+ MaybePackage :: Package ( p) => p. manifest ( ) . features ( ) ,
527
+ MaybePackage :: Virtual ( vm) => vm. features ( ) ,
528
+ } ;
529
+ let mut warnings = Vec :: new ( ) ;
530
+ self . config . profiles ( ) ?. validate ( features, & mut warnings) ?;
531
+ for warning in warnings {
532
+ self . config . shell ( ) . warn ( & warning) ?;
533
+ }
534
+
535
+ // The rest of the checks require a VirtualManifest or multiple members.
527
536
if self . root_manifest . is_none ( ) {
528
537
return Ok ( ( ) ) ;
529
538
}
0 commit comments