@@ -74,7 +74,7 @@ pub enum ProgressBarStyle {
7474  /// Shows a progress bar with human readable download size 
7575DownloadBars , 
7676
77-   /// Shows a progress bar with numeric progres  count 
77+   /// Shows a progress bar with numeric progress  count 
7878ProgressBars , 
7979
8080  /// Shows a list of currently downloaded files. 
@@ -134,6 +134,7 @@ struct InternalState {
134134  keep_alive_count :  usize , 
135135  total_entries :  usize , 
136136  entries :  Vec < Arc < ProgressBarEntry > > , 
137+   is_deferring_display :  bool , 
137138} 
138139
139140#[ derive( Clone ,  Debug ) ]  
@@ -151,17 +152,42 @@ impl ProgressBarInner {
151152        keep_alive_count :  0 , 
152153        total_entries :  0 , 
153154        entries :  Vec :: new ( ) , 
155+         is_deferring_display :  false , 
154156      } ) ) , 
155157      renderer, 
156158    } 
157159  } 
158160
161+   /// A deferred entry will only be shown once another entry 
162+ /// is added to the progress bar. 
163+ pub  fn  add_deferred_entry ( 
164+     & self , 
165+     kind :  ProgressMessagePrompt , 
166+     message :  String , 
167+   )  -> Arc < ProgressBarEntry >  { 
168+     let  mut  internal_state = self . state . lock ( ) ; 
169+     if  internal_state. entries . is_empty ( )  { 
170+       internal_state. is_deferring_display  = true ; 
171+     } 
172+     self . add_entry_internal ( & mut  internal_state,  kind,  message) 
173+   } 
174+ 
159175  pub  fn  add_entry ( 
160176    & self , 
161177    kind :  ProgressMessagePrompt , 
162178    message :  String , 
163179  )  -> Arc < ProgressBarEntry >  { 
164180    let  mut  internal_state = self . state . lock ( ) ; 
181+     internal_state. is_deferring_display  = false ; 
182+     self . add_entry_internal ( & mut  internal_state,  kind,  message) 
183+   } 
184+ 
185+   fn  add_entry_internal ( 
186+     & self , 
187+     internal_state :  & mut  InternalState , 
188+     kind :  ProgressMessagePrompt , 
189+     message :  String , 
190+   )  -> Arc < ProgressBarEntry >  { 
165191    let  id = internal_state. total_entries ; 
166192    let  entry = Arc :: new ( ProgressBarEntry  { 
167193      id, 
@@ -175,7 +201,7 @@ impl ProgressBarInner {
175201    internal_state. total_entries  += 1 ; 
176202    internal_state. keep_alive_count  += 1 ; 
177203
178-     self . maybe_start_draw_thread ( & mut   internal_state) ; 
204+     self . maybe_start_draw_thread ( internal_state) ; 
179205
180206    entry
181207  } 
@@ -188,20 +214,13 @@ impl ProgressBarInner {
188214      . binary_search_by ( |e| e. id . cmp ( & entry_id) ) 
189215    { 
190216      internal_state. entries . remove ( index) ; 
217+       if  internal_state. entries . is_empty ( )  { 
218+         internal_state. is_deferring_display  = false ; 
219+       } 
191220      self . decrement_keep_alive ( & mut  internal_state) ; 
192221    } 
193222  } 
194223
195-   pub  fn  increment_clear ( & self )  { 
196-     let  mut  internal_state = self . state . lock ( ) ; 
197-     internal_state. keep_alive_count  += 1 ; 
198-   } 
199- 
200-   pub  fn  decrement_clear ( & self )  { 
201-     let  mut  internal_state = self . state . lock ( ) ; 
202-     self . decrement_keep_alive ( & mut  internal_state) ; 
203-   } 
204- 
205224  fn  decrement_keep_alive ( & self ,  state :  & mut  InternalState )  { 
206225    state. keep_alive_count  -= 1 ; 
207226
@@ -226,7 +245,7 @@ impl DrawThreadRenderer for ProgressBarInner {
226245  fn  render ( & self ,  size :  & ConsoleSize )  -> String  { 
227246    let  data = { 
228247      let  state = self . state . lock ( ) ; 
229-       if  state. entries . is_empty ( )  { 
248+       if  state. entries . is_empty ( )  || state . is_deferring_display   { 
230249        return  String :: new ( ) ; 
231250      } 
232251      let  display_entries = state
@@ -268,7 +287,7 @@ pub struct ProgressBar {
268287
269288impl  deno_npm_installer:: Reporter  for  ProgressBar  { 
270289  type  Guard  = UpdateGuard ; 
271-   type  ClearGuard  = ClearGuard ; 
290+   type  ClearGuard  = UpdateGuard ; 
272291
273292  fn  on_blocking ( & self ,  message :  & str )  -> Self :: Guard  { 
274293    self . update_with_prompt ( ProgressMessagePrompt :: Blocking ,  message) 
@@ -279,7 +298,7 @@ impl deno_npm_installer::Reporter for ProgressBar {
279298  } 
280299
281300  fn  clear_guard ( & self )  -> Self :: ClearGuard  { 
282-     self . clear_guard ( ) 
301+     self . deferred_keep_initialize_alive ( ) 
283302  } 
284303} 
285304
@@ -334,22 +353,27 @@ impl ProgressBar {
334353    } 
335354  } 
336355
337-   pub  fn  clear_guard ( & self )  -> ClearGuard  { 
338-     self . inner . increment_clear ( ) ; 
339-     ClearGuard  {  pb :  self . clone ( )  } 
340-   } 
341- 
342-   fn  decrement_clear ( & self )  { 
343-     self . inner . decrement_clear ( ) ; 
356+   pub  fn  deferred_keep_initialize_alive ( & self )  -> UpdateGuard  { 
357+     self . deferred_update_with_prompt ( ProgressMessagePrompt :: Initialize ,  "" ) 
344358  } 
345- } 
346- 
347- pub  struct  ClearGuard  { 
348-   pb :  ProgressBar , 
349- } 
350359
351- impl  Drop  for  ClearGuard  { 
352-   fn  drop ( & mut  self )  { 
353-     self . pb . decrement_clear ( ) ; 
360+   /// Add an entry to the progress bar that will only be shown 
361+ /// once another entry has been added. 
362+ pub  fn  deferred_update_with_prompt ( 
363+     & self , 
364+     kind :  ProgressMessagePrompt , 
365+     msg :  & str , 
366+   )  -> UpdateGuard  { 
367+     // only check if progress bars are supported once we go 
368+     // to update so that we lazily initialize the progress bar 
369+     if  ProgressBar :: are_supported ( )  { 
370+       let  entry = self . inner . add_deferred_entry ( kind,  msg. to_string ( ) ) ; 
371+       UpdateGuard  { 
372+         maybe_entry :  Some ( entry) , 
373+       } 
374+     }  else  { 
375+       // do not display anything for a deferred update 
376+       UpdateGuard  {  maybe_entry :  None  } 
377+     } 
354378  } 
355379} 
0 commit comments