upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/client.rs31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/lib/client.rs b/src/lib/client.rs
index 0c76fb1..e08b62b 100644
--- a/src/lib/client.rs
+++ b/src/lib/client.rs
@@ -451,6 +451,20 @@ impl Connect for Client {
451 MultiProgress::with_draw_target(ProgressDrawTarget::hidden()) 451 MultiProgress::with_draw_target(ProgressDrawTarget::hidden())
452 }; 452 };
453 453
454 // Pre-add a heading bar at position 0 so it has a reserved slot
455 // before any relay bars are added. It stays hidden (draw target is
456 // hidden) until the timer reveals it.
457 let heading_bar = if !verbose && !is_test {
458 let bar = progress_reporter.add(
459 ProgressBar::new(0).with_style(
460 ProgressStyle::with_template("{msg}").unwrap(),
461 ),
462 );
463 Some(bar)
464 } else {
465 None
466 };
467
454 // Track whether the detail view has been revealed. Bars that finish 468 // Track whether the detail view has been revealed. Bars that finish
455 // before reveal have their finish_with_message deferred so they render 469 // before reveal have their finish_with_message deferred so they render
456 // correctly once the draw target switches from hidden to stderr. 470 // correctly once the draw target switches from hidden to stderr.
@@ -467,6 +481,7 @@ impl Connect for Client {
467 let detail_multi_for_timer = progress_reporter.clone(); 481 let detail_multi_for_timer = progress_reporter.clone();
468 let spinner_for_timer = spinner_multi.as_ref().map(|(_, s)| s.clone()); 482 let spinner_for_timer = spinner_multi.as_ref().map(|(_, s)| s.clone());
469 let reveal_state_for_timer = reveal_state.clone(); 483 let reveal_state_for_timer = reveal_state.clone();
484 let heading_bar_for_timer = heading_bar.clone();
470 let timer_handle = if !verbose && !is_test { 485 let timer_handle = if !verbose && !is_test {
471 let handle = tokio::spawn(async move { 486 let handle = tokio::spawn(async move {
472 tokio::time::sleep(Duration::from_millis(SPINNER_EXPAND_DELAY_MS)).await; 487 tokio::time::sleep(Duration::from_millis(SPINNER_EXPAND_DELAY_MS)).await;
@@ -477,17 +492,11 @@ impl Connect for Client {
477 // Switch draw target to make bars visible 492 // Switch draw target to make bars visible
478 detail_multi_for_timer 493 detail_multi_for_timer
479 .set_draw_target(ProgressDrawTarget::stderr()); 494 .set_draw_target(ProgressDrawTarget::stderr());
480 // Add heading as a finished progress bar so it gets cleared 495 // Finish the pre-added heading bar now that the draw target
481 // along with the other bars by progress_reporter.clear(). 496 // is visible so indicatif actually renders it.
482 // Must be inserted after the draw target switch so that 497 if let Some(heading) = heading_bar_for_timer {
483 // finish_with_message renders it. 498 heading.finish_with_message("fetching updates...");
484 let heading = detail_multi_for_timer.insert( 499 }
485 0,
486 ProgressBar::new(0).with_style(
487 ProgressStyle::with_template("{msg}").unwrap(),
488 ),
489 );
490 heading.finish_with_message("fetching updates...");
491 // Mark as revealed and flush all bars that finished while 500 // Mark as revealed and flush all bars that finished while
492 // the draw target was hidden. Hold the lock across the flag 501 // the draw target was hidden. Hold the lock across the flag
493 // update and drain so no bar can slip through unseen (see 502 // update and drain so no bar can slip through unseen (see