@@ -145,6 +145,7 @@ async fn do_for_all_rust_packages(
145145 let ( release_pkgs, debug_pkgs) : ( Vec < _ > , _ ) = config
146146 . package_config
147147 . packages_to_build ( & config. target )
148+ . 0
148149 . into_iter ( )
149150 . filter_map ( |( name, pkg) | match & pkg. source {
150151 PackageSource :: Local { rust : Some ( rust_pkg) , .. } => {
@@ -463,63 +464,19 @@ async fn get_package(
463464}
464465
465466async fn do_package ( config : & Config , output_directory : & Path ) -> Result < ( ) > {
466- use topological_sort:: TopologicalSort ;
467-
468467 create_dir_all ( & output_directory)
469468 . map_err ( |err| anyhow ! ( "Cannot create output directory: {}" , err) ) ?;
470469
471470 let ui = ProgressUI :: new ( ) ;
472471
473472 do_build ( & config) . await ?;
474473
475- let mut all_packages = config
476- . package_config
477- . packages_to_build ( & config. target )
478- . into_iter ( )
479- . map ( |( package_name, package) | {
480- ( package. get_output_file ( package_name) , ( package_name, package) )
481- } )
482- . collect :: < std:: collections:: BTreeMap < _ , _ > > ( ) ;
483-
484- let mut outputs = TopologicalSort :: < String > :: new ( ) ;
485- for ( package_output, ( _, package) ) in & all_packages {
486- match & package. source {
487- PackageSource :: Local { .. }
488- | PackageSource :: Prebuilt { .. }
489- | PackageSource :: Manual => {
490- // Skip intermediate leaf packages; if necessary they'll be
491- // added to the dependency graph by whatever composite package
492- // actually depends on them.
493- if !matches ! (
494- package. output,
495- PackageOutput :: Zone { intermediate_only: true }
496- ) {
497- outputs. insert ( package_output) ;
498- }
499- }
500- PackageSource :: Composite { packages : deps } => {
501- for dep in deps {
502- outputs. add_dependency ( dep, package_output) ;
503- }
504- }
505- }
506- }
507-
508- while !outputs. is_empty ( ) {
509- let batch = outputs. pop_all ( ) ;
510- assert ! (
511- !batch. is_empty( ) || outputs. is_empty( ) ,
512- "cyclic dependency in package manifest!"
513- ) ;
514-
515- let packages = batch. into_iter ( ) . map ( |output| {
516- all_packages
517- . remove ( & output)
518- . expect ( "package should've already been handled." )
519- } ) ;
474+ let packages = config. package_config . packages_to_build ( & config. target ) ;
520475
521- let ui_refs = vec ! [ ui. clone( ) ; packages. len( ) ] ;
522- let pkg_stream = stream:: iter ( packages)
476+ let package_iter = packages. build_order ( ) ;
477+ for batch in package_iter {
478+ let ui_refs = vec ! [ ui. clone( ) ; batch. len( ) ] ;
479+ let pkg_stream = stream:: iter ( batch)
523480 . zip ( stream:: iter ( ui_refs) )
524481 . map ( Ok :: < _ , anyhow:: Error > )
525482 . try_for_each_concurrent (
@@ -553,6 +510,7 @@ async fn do_stamp(
553510 let ( _name, package) = config
554511 . package_config
555512 . packages_to_deploy ( & config. target )
513+ . 0
556514 . into_iter ( )
557515 . find ( |( name, _pkg) | name. as_str ( ) == package_name)
558516 . ok_or_else ( || anyhow ! ( "Package {package_name} not found" ) ) ?;
@@ -574,7 +532,7 @@ async fn do_unpack(
574532 } ) ?;
575533
576534 // Copy all packages to the install location in parallel.
577- let packages = config. package_config . packages_to_deploy ( & config. target ) ;
535+ let packages = config. package_config . packages_to_deploy ( & config. target ) . 0 ;
578536
579537 packages. par_iter ( ) . try_for_each (
580538 |( package_name, package) | -> Result < ( ) > {
@@ -704,6 +662,7 @@ fn uninstall_all_packages(config: &Config) {
704662 for ( _, package) in config
705663 . package_config
706664 . packages_to_deploy ( & config. target )
665+ . 0
707666 . into_iter ( )
708667 . filter ( |( _, package) | matches ! ( package. output, PackageOutput :: Tarball ) )
709668 {
0 commit comments