diff --git a/Cargo.lock b/Cargo.lock index d61525c59e..a9e01f0c06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1477,14 +1477,15 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.16.2" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" +checksum = "8ff8cc23a7393a397ed1d7f56e6365cba772aba9f9912ab968b03043c395d057" dependencies = [ "console", - "lazy_static", + "instant", "number_prefix", - "regex", + "portable-atomic", + "unicode-width", ] [[package]] @@ -2187,6 +2188,12 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "portable-atomic" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767eb9f07d4a5ebcb39bbf2d452058a93c011373abf6832e24194a1c3f004794" + [[package]] name = "ppv-lite86" version = "0.2.16" diff --git a/Cargo.toml b/Cargo.toml index 3a3c2e4e65..9a09f0fce1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ dyn-clone = "1.0" expanduser = "1.2" futures = "0.3.24" fuser = "0.12" -indicatif = "0.16.2" +indicatif = "0.17.5" lazy_static = "1.4" libc = "0.2.80" nix = "0.26.2" diff --git a/crates/progress_bar_derive_macro/Cargo.toml b/crates/progress_bar_derive_macro/Cargo.toml index c4611ced1b..2a742c6706 100644 --- a/crates/progress_bar_derive_macro/Cargo.toml +++ b/crates/progress_bar_derive_macro/Cargo.toml @@ -9,7 +9,7 @@ proc-macro = true [dependencies] syn = "2.0" quote = "1.0" +indicatif = { workspace = true } [dev-dependencies] -indicatif = { workspace = true } -tracing = { workspace = true } \ No newline at end of file +tracing = { workspace = true } diff --git a/crates/progress_bar_derive_macro/src/lib.rs b/crates/progress_bar_derive_macro/src/lib.rs index 0afde19a12..f214730f58 100644 --- a/crates/progress_bar_derive_macro/src/lib.rs +++ b/crates/progress_bar_derive_macro/src/lib.rs @@ -6,13 +6,13 @@ use proc_macro::TokenStream; use quote::{format_ident, quote}; use syn::LitStr; -/// Derive macro for generating boilerplate `Default` and `Drop` impls -/// for a struct with `indicatif::ProgressBar` fields. +/// Derive macro for generating boilerplate [`Default`] and [`Drop`] impls +/// for a struct with [`indicatif::ProgressBar`] fields. /// -/// The struct is required to have a field named `renderer` and one or more -/// fields of type `indicatif::ProgressBar`. Each progress bar field requires -/// a `#[progress_bar]` attribute with a `message` argument. A `template` -/// argument is also required either at the struct level or the field level. +/// The struct is required to have one or more fields of type [`indicatif::ProgressBar`]. +/// Each progress bar field requires a `#[progress_bar]` attribute with a `message` +/// argument. A `template` argument is also required either at the struct level or +/// the field level. /// /// # Example /// @@ -20,7 +20,6 @@ use syn::LitStr; /// use progress_bar_derive_macro::ProgressBar; /// #[derive(ProgressBar)] /// struct MyStruct { -/// renderer: Option>, /// #[progress_bar( /// message = "processing widgets", /// template = " {spinner} {msg:<16.green} [{bar:40.cyan/dim}] {pos:>8}/{len:6}" @@ -120,6 +119,7 @@ fn impl_proc_macro_derive(ast: &syn::DeriveInput) -> TokenStream { bars.push(quote! { let #ident_style = indicatif::ProgressStyle::default_bar() .template(#template) + .expect("Invalid progress bar template") .tick_strings(TICK_STRINGS) .progress_chars(PROGRESS_CHARS); let #ident = bars.add( @@ -143,26 +143,9 @@ fn impl_proc_macro_derive(ast: &syn::DeriveInput) -> TokenStream { let bars = indicatif::MultiProgress::new(); #(#bars)* - #(#progress_bar_field_names.enable_steady_tick(100);)* - // the progress bar must be awaited from some thread - // or nothing will be shown in the terminal - let renderer = Some(std::thread::spawn(move || { - if let Err(err) = bars.join() { - tracing::error!("Failed to render commit progress: {}", err); - } - })); + #(#progress_bar_field_names.enable_steady_tick(std::time::Duration::from_millis(100));)* Self { #(#progress_bar_field_names,)* - renderer, - } - } - } - - impl Drop for #name { - fn drop(&mut self) { - #(self.#progress_bar_field_names.finish_and_clear();)* - if let Some(r) = self.renderer.take() { - let _ = r.join(); } } } diff --git a/crates/spfs/src/check.rs b/crates/spfs/src/check.rs index c9866d2358..a050c6638e 100644 --- a/crates/spfs/src/check.rs +++ b/crates/spfs/src/check.rs @@ -597,7 +597,6 @@ impl CheckReporter for ConsoleCheckReporter { #[derive(ProgressBar)] struct ConsoleCheckReporterBars { - renderer: Option>, #[progress_bar( message = "scanning objects", template = " {spinner} {msg:<18.green} {pos:>9} reached in {elapsed:.cyan} [{per_sec}]" diff --git a/crates/spfs/src/clean.rs b/crates/spfs/src/clean.rs index 1c26f14c0b..e803e787cb 100644 --- a/crates/spfs/src/clean.rs +++ b/crates/spfs/src/clean.rs @@ -952,7 +952,6 @@ impl CleanReporter for ConsoleCleanReporter { template = " {spinner} {msg:<17.green} {pos:>10.cyan} found {len:>10.yellow} to remove [{per_sec}]" )] struct ConsoleCleanReporterBars { - renderer: Option>, #[progress_bar(message = "cleaning tags")] tags: indicatif::ProgressBar, #[progress_bar(message = "cleaning objects")] diff --git a/crates/spfs/src/commit.rs b/crates/spfs/src/commit.rs index 65c75b5037..13dbbd577d 100644 --- a/crates/spfs/src/commit.rs +++ b/crates/spfs/src/commit.rs @@ -391,7 +391,6 @@ impl CommitReporter for ConsoleCommitReporter { #[derive(ProgressBar)] #[progress_bar(template = " {spinner} {msg:<18.green} [{bar:40.cyan/dim}] {pos:>8}/{len:6}")] struct ConsoleCommitReporterBars { - renderer: Option>, #[progress_bar(message = "computing manifest")] entries: indicatif::ProgressBar, #[progress_bar(message = "committing blobs")] diff --git a/crates/spfs/src/storage/fs/render_reporter.rs b/crates/spfs/src/storage/fs/render_reporter.rs index 4edeeae104..61374dc2d1 100644 --- a/crates/spfs/src/storage/fs/render_reporter.rs +++ b/crates/spfs/src/storage/fs/render_reporter.rs @@ -100,7 +100,6 @@ impl RenderReporter for ConsoleRenderReporter { #[derive(ProgressBar)] #[progress_bar(template = " {spinner} {msg:<16.green} [{bar:40.cyan/dim}] {pos:>8}/{len:6}")] struct ConsoleRenderReporterBars { - renderer: Option>, #[progress_bar(message = "rendering layers")] layers: indicatif::ProgressBar, #[progress_bar(message = "rendering entries")] diff --git a/crates/spfs/src/sync.rs b/crates/spfs/src/sync.rs index f82af1a142..3e79125e29 100644 --- a/crates/spfs/src/sync.rs +++ b/crates/spfs/src/sync.rs @@ -595,7 +595,6 @@ impl SyncReporter for ConsoleSyncReporter { #[derive(ProgressBar)] struct ConsoleSyncReporterBars { - renderer: Option>, #[progress_bar( message = "syncing layers", template = " {spinner} {msg:<16.green} [{bar:40.cyan/dim}] {pos:>8}/{len:6}"