From fe5d944afa8ecd46b9ca3b2fc0539c3c52cb8f83 Mon Sep 17 00:00:00 2001 From: elle Date: Mon, 27 Oct 2025 16:17:14 +0000 Subject: [PATCH] Change reporter length to `Option` (#16448) ## Summary Changes the `length` parameter to `PythonDownloadReporter::new` to an `Option` to resolve the issue of setting a single-item reporter length. Resolves: #15404 ## Test Plan - build test - ran test suite --- crates/uv/src/commands/cache_clean.rs | 4 ++-- crates/uv/src/commands/python/install.rs | 2 +- crates/uv/src/commands/reporters.rs | 28 ++++++++++-------------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/crates/uv/src/commands/cache_clean.rs b/crates/uv/src/commands/cache_clean.rs index 0c7c613c8..c645c4a90 100644 --- a/crates/uv/src/commands/cache_clean.rs +++ b/crates/uv/src/commands/cache_clean.rs @@ -51,14 +51,14 @@ pub(crate) fn cache_clean( )?; let num_paths = walkdir::WalkDir::new(cache.root()).into_iter().count(); - let reporter = CleaningDirectoryReporter::new(printer, num_paths); + let reporter = CleaningDirectoryReporter::new(printer, Some(num_paths)); let root = cache.root().to_path_buf(); cache .clear(Box::new(reporter)) .with_context(|| format!("Failed to clear cache at: {}", root.user_display()))? } else { - let reporter = CleaningPackageReporter::new(printer, packages.len()); + let reporter = CleaningPackageReporter::new(printer, Some(packages.len())); let mut summary = Removal::default(); for package in packages { diff --git a/crates/uv/src/commands/python/install.rs b/crates/uv/src/commands/python/install.rs index c581ccdc1..2eff6e8f9 100644 --- a/crates/uv/src/commands/python/install.rs +++ b/crates/uv/src/commands/python/install.rs @@ -407,7 +407,7 @@ pub(crate) async fn install( // default retries to avoid the middleware from performing uncontrolled retries. let client = client_builder.retries(0).build(); - let reporter = PythonDownloadReporter::new(printer, downloads.len() as u64); + let reporter = PythonDownloadReporter::new(printer, Some(downloads.len() as u64)); let mut tasks = FuturesUnordered::new(); for download in &downloads { diff --git a/crates/uv/src/commands/reporters.rs b/crates/uv/src/commands/reporters.rs index 74c21307b..1a1c170bf 100644 --- a/crates/uv/src/commands/reporters.rs +++ b/crates/uv/src/commands/reporters.rs @@ -637,16 +637,13 @@ pub(crate) struct PythonDownloadReporter { impl PythonDownloadReporter { /// Initialize a [`PythonDownloadReporter`] for a single Python download. pub(crate) fn single(printer: Printer) -> Self { - Self::new(printer, 1) + Self::new(printer, None) } /// Initialize a [`PythonDownloadReporter`] for multiple Python downloads. - pub(crate) fn new(printer: Printer, length: u64) -> Self { + pub(crate) fn new(printer: Printer, length: Option) -> Self { let multi_progress = MultiProgress::with_draw_target(printer.target()); - let root = multi_progress.add(ProgressBar::with_draw_target( - Some(length), - printer.target(), - )); + let root = multi_progress.add(ProgressBar::with_draw_target(length, printer.target())); let reporter = ProgressReporter::new(root, multi_progress, printer); Self { reporter } } @@ -680,16 +677,13 @@ pub(crate) struct PublishReporter { impl PublishReporter { /// Initialize a [`PublishReporter`] for a single upload. pub(crate) fn single(printer: Printer) -> Self { - Self::new(printer, 1) + Self::new(printer, None) } /// Initialize a [`PublishReporter`] for multiple uploads. - pub(crate) fn new(printer: Printer, length: u64) -> Self { + pub(crate) fn new(printer: Printer, length: Option) -> Self { let multi_progress = MultiProgress::with_draw_target(printer.target()); - let root = multi_progress.add(ProgressBar::with_draw_target( - Some(length), - printer.target(), - )); + let root = multi_progress.add(ProgressBar::with_draw_target(length, printer.target())); let reporter = ProgressReporter::new(root, multi_progress, printer); Self { reporter } } @@ -758,8 +752,8 @@ pub(crate) struct CleaningDirectoryReporter { impl CleaningDirectoryReporter { /// Initialize a [`CleaningDirectoryReporter`] for cleaning the cache directory. - pub(crate) fn new(printer: Printer, max: usize) -> Self { - let bar = ProgressBar::with_draw_target(Some(max as u64), printer.target()); + pub(crate) fn new(printer: Printer, max: Option) -> Self { + let bar = ProgressBar::with_draw_target(max.map(|m| m as u64), printer.target()); bar.set_style( ProgressStyle::with_template("{prefix} [{bar:20}] {percent}%") .unwrap() @@ -787,8 +781,8 @@ pub(crate) struct CleaningPackageReporter { impl CleaningPackageReporter { /// Initialize a [`CleaningPackageReporter`] for cleaning packages from the cache. - pub(crate) fn new(printer: Printer, max: usize) -> Self { - let bar = ProgressBar::with_draw_target(Some(max as u64), printer.target()); + pub(crate) fn new(printer: Printer, max: Option) -> Self { + let bar = ProgressBar::with_draw_target(max.map(|m| m as u64), printer.target()); bar.set_style( ProgressStyle::with_template("{prefix} [{bar:20}] {pos}/{len}{msg}") .unwrap() @@ -841,7 +835,7 @@ impl BinaryDownloadReporter { /// Initialize a [`BinaryDownloadReporter`] for a single binary download. pub(crate) fn single(printer: Printer) -> Self { let multi_progress = MultiProgress::with_draw_target(printer.target()); - let root = multi_progress.add(ProgressBar::with_draw_target(Some(1), printer.target())); + let root = multi_progress.add(ProgressBar::with_draw_target(None, printer.target())); let reporter = ProgressReporter::new(root, multi_progress, printer); Self { reporter } }