1- use  std:: collections:: hash_map:: Entry ; 
1+ use  std:: { collections:: hash_map:: Entry ,  sync :: Arc } ; 
22
33use  futures:: FutureExt ; 
44use  tokio_util:: sync:: CancellationToken ; 
@@ -8,6 +8,7 @@ use crate::{
88    CommandDispatcherError ,  Reporter ,  SourceBuildError ,  SourceBuildResult ,  SourceBuildSpec , 
99    command_dispatcher:: { CommandDispatcherContext ,  SourceBuildId ,  SourceBuildTask } , 
1010} ; 
11+ use  rattler_repodata_gateway:: RunExportsReporter ; 
1112
1213impl  CommandDispatcherProcessor  { 
1314    /// Constructs a new [`SourceBuildId`] for the given `task`. 
@@ -61,15 +62,6 @@ impl CommandDispatcherProcessor {
6162                        . insert ( source_build_id,  reporter_id) ; 
6263                } 
6364
64-                 if  let  Some ( ( reporter,  reporter_id) )  = self 
65-                     . reporter 
66-                     . as_deref_mut ( ) 
67-                     . and_then ( Reporter :: as_source_build_reporter) 
68-                     . zip ( reporter_id) 
69-                 { 
70-                     reporter. on_started ( reporter_id) 
71-                 } 
72- 
7365                self . queue_source_build_task ( source_build_id,  task. spec ,  task. cancellation_token ) ; 
7466            } 
7567        } 
@@ -82,19 +74,27 @@ impl CommandDispatcherProcessor {
8274        spec :  SourceBuildSpec , 
8375        cancellation_token :  CancellationToken , 
8476    )  { 
85-         let  dispatcher = self 
86-             . create_task_command_dispatcher ( CommandDispatcherContext :: SourceBuild ( source_build_id) ) ; 
87- 
8877        let  dispatcher_context = CommandDispatcherContext :: SourceBuild ( source_build_id) ; 
78+         let  dispatcher = self . create_task_command_dispatcher ( dispatcher_context) ; 
79+ 
8980        let  reporter_context = self . reporter_context ( dispatcher_context) ; 
90-         let  run_exports_reporter = self 
91-             . reporter 
92-             . as_mut ( ) 
93-             . and_then ( |reporter| reporter. create_run_exports_reporter ( reporter_context) ) ; 
81+         let  ( tx,  rx)  = futures:: channel:: mpsc:: unbounded :: < String > ( ) ; 
82+ 
83+         let  mut  run_exports_reporter:  Option < Arc < dyn  RunExportsReporter > >  = None ; 
84+         if  let  Some ( reporter)  = self . reporter . as_mut ( )  { 
85+             let  created = reporter. create_run_exports_reporter ( reporter_context) ; 
86+             if  let  Some ( ( source_reporter,  reporter_id) )  = reporter
87+                 . as_source_build_reporter ( ) 
88+                 . zip ( self . source_build_reporters . get ( & source_build_id) . copied ( ) ) 
89+             { 
90+                 source_reporter. on_started ( reporter_id,  Box :: new ( rx) ,  created. clone ( ) ) ; 
91+             } 
92+             run_exports_reporter = created; 
93+         } 
9494
9595        self . pending_futures . push ( 
9696            cancellation_token
97-                 . run_until_cancelled_owned ( spec. build ( dispatcher,  run_exports_reporter) ) 
97+                 . run_until_cancelled_owned ( spec. build ( dispatcher,  run_exports_reporter. clone ( ) ,  tx ) ) 
9898                . map ( move  |result| { 
9999                    TaskResult :: SourceBuild ( 
100100                        source_build_id, 
@@ -122,7 +122,8 @@ impl CommandDispatcherProcessor {
122122            . and_then ( Reporter :: as_source_build_reporter) 
123123            . zip ( self . source_build_reporters . remove ( & id) ) 
124124        { 
125-             reporter. on_finished ( reporter_id) ; 
125+             let  failed = result. as_ref ( ) . is_err ( ) ; 
126+             reporter. on_finished ( reporter_id,  failed) ; 
126127        } 
127128
128129        self . source_build 
0 commit comments