@@ -75,9 +75,7 @@ impl<'lock> Installable<'lock> for InstallTarget<'lock> {
7575 match self {
7676 Self :: Project { name, .. } => Box :: new ( std:: iter:: once ( * name) ) ,
7777 Self :: Projects { names, .. } => Box :: new ( names. iter ( ) ) ,
78- Self :: NonProjectWorkspace { lock, .. } => {
79- Box :: new ( lock. members ( ) . iter ( ) )
80- }
78+ Self :: NonProjectWorkspace { lock, .. } => Box :: new ( lock. members ( ) . iter ( ) ) ,
8179 Self :: Workspace { lock, .. } => {
8280 // Identify the workspace members.
8381 //
@@ -297,9 +295,9 @@ impl<'lock> InstallTarget<'lock> {
297295 Err ( ProjectError :: MissingExtraProject ( extra. clone ( ) ) )
298296 }
299297 Self :: Projects { .. } => {
300- Err ( ProjectError :: MissingExtraWorkspace ( extra. clone ( ) ) )
298+ Err ( ProjectError :: MissingExtraProjects ( extra. clone ( ) ) )
301299 }
302- _ => Err ( ProjectError :: MissingExtraWorkspace ( extra. clone ( ) ) ) ,
300+ _ => Err ( ProjectError :: MissingExtraProjects ( extra. clone ( ) ) ) ,
303301 } ;
304302 }
305303 }
@@ -355,7 +353,7 @@ impl<'lock> InstallTarget<'lock> {
355353
356354 for group in groups. explicit_names ( ) {
357355 if !known_groups. contains ( group) {
358- return Err ( ProjectError :: MissingGroupWorkspace ( group. clone ( ) ) ) ;
356+ return Err ( ProjectError :: MissingGroupProjects ( group. clone ( ) ) ) ;
359357 }
360358 }
361359 }
@@ -376,8 +374,12 @@ impl<'lock> InstallTarget<'lock> {
376374 for group in groups. explicit_names ( ) {
377375 if !known_groups. contains ( group) {
378376 return match self {
379- Self :: Project { .. } => Err ( ProjectError :: MissingGroupProject ( group. clone ( ) ) ) ,
380- Self :: Projects { .. } => Err ( ProjectError :: MissingGroupWorkspace ( group. clone ( ) ) ) ,
377+ Self :: Project { .. } => {
378+ Err ( ProjectError :: MissingGroupProject ( group. clone ( ) ) )
379+ }
380+ Self :: Projects { .. } => {
381+ Err ( ProjectError :: MissingGroupProjects ( group. clone ( ) ) )
382+ }
381383 _ => unreachable ! ( ) ,
382384 } ;
383385 }
@@ -402,108 +404,27 @@ impl<'lock> InstallTarget<'lock> {
402404 groups : & DependencyGroupsWithDefaults ,
403405 ) -> BTreeSet < & PackageName > {
404406 match self {
405- Self :: Project { name, lock, .. } => {
406- // Collect the packages by name for efficient lookup.
407- let packages = lock
408- . packages ( )
409- . iter ( )
410- . map ( |p| ( p. name ( ) , p) )
411- . collect :: < BTreeMap < _ , _ > > ( ) ;
412-
413- // We'll include the project itself
414- let mut required_members = BTreeSet :: new ( ) ;
415- required_members. insert ( * name) ;
416-
417- // Find all workspace member dependencies recursively
418- let mut queue: VecDeque < ( & PackageName , Option < & ExtraName > ) > = VecDeque :: new ( ) ;
419- let mut seen: FxHashSet < ( & PackageName , Option < & ExtraName > ) > = FxHashSet :: default ( ) ;
420-
421- let Some ( root_package) = packages. get ( name) else {
422- return required_members;
423- } ;
424-
425- if groups. prod ( ) {
426- // Add the root package
427- queue. push_back ( ( name, None ) ) ;
428- seen. insert ( ( name, None ) ) ;
429-
430- // Add explicitly activated extras for the root package
431- for extra in extras. extra_names ( root_package. optional_dependencies ( ) . keys ( ) ) {
432- if seen. insert ( ( name, Some ( extra) ) ) {
433- queue. push_back ( ( name, Some ( extra) ) ) ;
434- }
435- }
436- }
437-
438- // Add activated dependency groups for the root package
439- for ( group_name, dependencies) in root_package. resolved_dependency_groups ( ) {
440- if !groups. contains ( group_name) {
441- continue ;
442- }
443- for dependency in dependencies {
444- let name = dependency. package_name ( ) ;
445- queue. push_back ( ( name, None ) ) ;
446- for extra in dependency. extra ( ) {
447- queue. push_back ( ( name, Some ( extra) ) ) ;
448- }
449- }
450- }
451-
452- while let Some ( ( pkg_name, extra) ) = queue. pop_front ( ) {
453- if lock. members ( ) . contains ( pkg_name) {
454- required_members. insert ( pkg_name) ;
455- }
456-
457- let Some ( package) = packages. get ( pkg_name) else {
458- continue ;
459- } ;
460-
461- let Some ( dependencies) = extra
462- . map ( |extra_name| {
463- package
464- . optional_dependencies ( )
465- . get ( extra_name)
466- . map ( Vec :: as_slice)
467- } )
468- . unwrap_or ( Some ( package. dependencies ( ) ) )
469- else {
470- continue ;
471- } ;
472-
473- for dependency in dependencies {
474- let name = dependency. package_name ( ) ;
475- if seen. insert ( ( name, None ) ) {
476- queue. push_back ( ( name, None ) ) ;
477- }
478- for extra in dependency. extra ( ) {
479- if seen. insert ( ( name, Some ( extra) ) ) {
480- queue. push_back ( ( name, Some ( extra) ) ) ;
481- }
482- }
483- }
484- }
407+ Self :: Project { lock, .. } | Self :: Projects { lock, .. } => {
408+ let roots = self . roots ( ) . collect :: < FxHashSet < _ > > ( ) ;
485409
486- required_members
487- }
488- Self :: Projects { names, lock, .. } => {
489410 // Collect the packages by name for efficient lookup.
490411 let packages = lock
491412 . packages ( )
492413 . iter ( )
493- . map ( |p | ( p . name ( ) , p ) )
414+ . map ( |package | ( package . name ( ) , package ) )
494415 . collect :: < BTreeMap < _ , _ > > ( ) ;
495416
496417 // We'll include all specified projects
497418 let mut required_members = BTreeSet :: new ( ) ;
498- for name in names . iter ( ) {
499- required_members. insert ( name) ;
419+ for name in & roots {
420+ required_members. insert ( * name) ;
500421 }
501422
502423 // Find all workspace member dependencies recursively for all specified packages
503424 let mut queue: VecDeque < ( & PackageName , Option < & ExtraName > ) > = VecDeque :: new ( ) ;
504425 let mut seen: FxHashSet < ( & PackageName , Option < & ExtraName > ) > = FxHashSet :: default ( ) ;
505426
506- for name in names . iter ( ) {
427+ for name in roots {
507428 let Some ( root_package) = packages. get ( name) else {
508429 continue ;
509430 } ;
@@ -515,7 +436,8 @@ impl<'lock> InstallTarget<'lock> {
515436 }
516437
517438 // Add explicitly activated extras for the root package
518- for extra in extras. extra_names ( root_package. optional_dependencies ( ) . keys ( ) ) {
439+ for extra in extras. extra_names ( root_package. optional_dependencies ( ) . keys ( ) )
440+ {
519441 if seen. insert ( ( name, Some ( extra) ) ) {
520442 queue. push_back ( ( name, Some ( extra) ) ) ;
521443 }
@@ -541,12 +463,12 @@ impl<'lock> InstallTarget<'lock> {
541463 }
542464 }
543465
544- while let Some ( ( pkg_name , extra) ) = queue. pop_front ( ) {
545- if lock. members ( ) . contains ( pkg_name ) {
546- required_members. insert ( pkg_name ) ;
466+ while let Some ( ( package_name , extra) ) = queue. pop_front ( ) {
467+ if lock. members ( ) . contains ( package_name ) {
468+ required_members. insert ( package_name ) ;
547469 }
548470
549- let Some ( package) = packages. get ( pkg_name ) else {
471+ let Some ( package) = packages. get ( package_name ) else {
550472 continue ;
551473 } ;
552474
0 commit comments