@@ -82,9 +82,34 @@ pub fn run_charon(args: &Args, roots: &Roots, packages: &[HermesArtifact]) -> Re
8282 log:: debug!( "Command: {:?}" , cmd) ;
8383
8484 cmd. stdout ( std:: process:: Stdio :: piped ( ) ) ;
85+ cmd. stderr ( std:: process:: Stdio :: piped ( ) ) ;
8586 let mut child = cmd. spawn ( ) . context ( "Failed to spawn charon" ) ?;
8687
8788 let mut output_error = false ;
89+
90+ let safety_buffer = std:: sync:: Arc :: new ( std:: sync:: Mutex :: new ( Vec :: new ( ) ) ) ;
91+ let safety_buffer_clone = std:: sync:: Arc :: clone ( & safety_buffer) ;
92+ if let Some ( stderr) = child. stderr . take ( ) {
93+ std:: thread:: spawn ( move || {
94+ use std:: io:: { BufRead , BufReader } ;
95+ let reader = BufReader :: new ( stderr) ;
96+ for line in reader. lines ( ) {
97+ if let Ok ( line) = line {
98+ if let Ok ( mut buf) = safety_buffer_clone. lock ( ) {
99+ buf. push ( line) ;
100+ }
101+ }
102+ }
103+ } ) ;
104+ }
105+
106+ let pb = indicatif:: ProgressBar :: new_spinner ( ) ;
107+ pb. set_style (
108+ indicatif:: ProgressStyle :: default_spinner ( ) . template ( "{spinner:.green} {msg}" ) . unwrap ( ) ,
109+ ) ;
110+ pb. enable_steady_tick ( std:: time:: Duration :: from_millis ( 100 ) ) ;
111+ pb. set_message ( "Compiling..." ) ;
112+
88113 if let Some ( stdout) = child. stdout . take ( ) {
89114 use std:: io:: { BufRead , BufReader } ;
90115 let reader = BufReader :: new ( stdout) ;
@@ -105,8 +130,13 @@ pub fn run_charon(args: &Args, roots: &Roots, packages: &[HermesArtifact]) -> Re
105130 if let Ok ( msg) = serde_json:: from_str :: < cargo_metadata:: Message > ( & line) {
106131 use cargo_metadata:: Message ;
107132 match msg {
133+ Message :: CompilerArtifact ( a) => {
134+ pb. set_message ( format ! ( "Compiling {}" , a. target. name) ) ;
135+ }
108136 Message :: CompilerMessage ( msg) => {
109- mapper. render_miette ( & msg. message ) ;
137+ pb. suspend ( || {
138+ mapper. render_miette ( & msg. message , |s| eprintln ! ( "{}" , s) ) ;
139+ } ) ;
110140 if matches ! (
111141 msg. message. level,
112142 DiagnosticLevel :: Error | DiagnosticLevel :: Ice
@@ -115,23 +145,34 @@ pub fn run_charon(args: &Args, roots: &Roots, packages: &[HermesArtifact]) -> Re
115145 }
116146 }
117147 Message :: TextLine ( t) => {
118- eprintln ! ( "{}" , t) ;
148+ if let Ok ( mut buf) = safety_buffer. lock ( ) {
149+ buf. push ( t) ;
150+ }
119151 }
120152 _ => { }
121153 }
122154 } else {
123- // Print non-JSON lines to stderr
124- eprintln ! ( "{}" , line) ;
155+ if let Ok ( mut buf) = safety_buffer. lock ( ) {
156+ buf. push ( line) ;
157+ }
125158 }
126159 }
127160 }
128161 }
129162
163+ pb. finish_and_clear ( ) ;
164+
130165 let status = child. wait ( ) . context ( "Failed to wait for charon" ) ?;
131166
132167 if output_error {
133168 bail ! ( "Diagnostic error in charon" ) ;
134169 } else if !status. success ( ) {
170+ // "Silent Death" dump
171+ if let Ok ( buf) = safety_buffer. lock ( ) {
172+ for line in buf. iter ( ) {
173+ eprintln ! ( "{}" , line) ;
174+ }
175+ }
135176 bail ! ( "Charon failed with status: {}" , status) ;
136177 }
137178 }
0 commit comments