1
1
use std:: cell:: RefCell ;
2
2
use std:: collections:: hash_map:: { Entry , HashMap } ;
3
- use std:: collections:: BTreeMap ;
3
+ use std:: collections:: { BTreeMap , HashSet } ;
4
4
use std:: path:: { Path , PathBuf } ;
5
5
use std:: slice;
6
6
@@ -10,7 +10,7 @@ use url::Url;
10
10
11
11
use crate :: core:: profiles:: Profiles ;
12
12
use crate :: core:: registry:: PackageRegistry ;
13
- use crate :: core:: { Dependency , PackageIdSpec } ;
13
+ use crate :: core:: { Dependency , PackageIdSpec , PackageId } ;
14
14
use crate :: core:: { EitherManifest , Package , SourceId , VirtualManifest } ;
15
15
use crate :: ops;
16
16
use crate :: sources:: PathSource ;
@@ -51,6 +51,7 @@ pub struct Workspace<'cfg> {
51
51
// paths. The packages themselves can be looked up through the `packages`
52
52
// set above.
53
53
members : Vec < PathBuf > ,
54
+ member_ids : HashSet < PackageId > ,
54
55
55
56
// The subset of `members` that are used by the
56
57
// `build`, `check`, `test`, and `bench` subcommands
@@ -148,6 +149,7 @@ impl<'cfg> Workspace<'cfg> {
148
149
root_manifest : None ,
149
150
target_dir,
150
151
members : Vec :: new ( ) ,
152
+ member_ids : HashSet :: new ( ) ,
151
153
default_members : Vec :: new ( ) ,
152
154
is_ephemeral : false ,
153
155
require_optional_deps : true ,
@@ -185,6 +187,7 @@ impl<'cfg> Workspace<'cfg> {
185
187
root_manifest : None ,
186
188
target_dir : None ,
187
189
members : Vec :: new ( ) ,
190
+ member_ids : HashSet :: new ( ) ,
188
191
default_members : Vec :: new ( ) ,
189
192
is_ephemeral : true ,
190
193
require_optional_deps,
@@ -193,6 +196,7 @@ impl<'cfg> Workspace<'cfg> {
193
196
} ;
194
197
{
195
198
let key = ws. current_manifest . parent ( ) . unwrap ( ) ;
199
+ let id = package. package_id ( ) ;
196
200
let package = MaybePackage :: Package ( package) ;
197
201
ws. packages . packages . insert ( key. to_path_buf ( ) , package) ;
198
202
ws. target_dir = if let Some ( dir) = target_dir {
@@ -201,6 +205,7 @@ impl<'cfg> Workspace<'cfg> {
201
205
ws. config . target_dir ( ) ?
202
206
} ;
203
207
ws. members . push ( ws. current_manifest . clone ( ) ) ;
208
+ ws. member_ids . insert ( id) ;
204
209
ws. default_members . push ( ws. current_manifest . clone ( ) ) ;
205
210
}
206
211
Ok ( ws)
@@ -315,7 +320,7 @@ impl<'cfg> Workspace<'cfg> {
315
320
316
321
/// Returns true if the package is a member of the workspace.
317
322
pub fn is_member ( & self , pkg : & Package ) -> bool {
318
- self . members ( ) . any ( |p| p == pkg)
323
+ self . member_ids . contains ( & pkg. package_id ( ) )
319
324
}
320
325
321
326
pub fn is_ephemeral ( & self ) -> bool {
@@ -430,6 +435,10 @@ impl<'cfg> Workspace<'cfg> {
430
435
debug ! ( "find_members - only me as a member" ) ;
431
436
self . members . push ( self . current_manifest . clone ( ) ) ;
432
437
self . default_members . push ( self . current_manifest . clone ( ) ) ;
438
+ if let Ok ( pkg) = self . current ( ) {
439
+ let id = pkg. package_id ( ) ;
440
+ self . member_ids . insert ( id) ;
441
+ }
433
442
return Ok ( ( ) ) ;
434
443
}
435
444
} ;
@@ -515,6 +524,7 @@ impl<'cfg> Workspace<'cfg> {
515
524
MaybePackage :: Package ( ref p) => p,
516
525
MaybePackage :: Virtual ( _) => return Ok ( ( ) ) ,
517
526
} ;
527
+ self . member_ids . insert ( pkg. package_id ( ) ) ;
518
528
pkg. dependencies ( )
519
529
. iter ( )
520
530
. map ( |d| d. source_id ( ) )
0 commit comments