diff --git a/Cargo.lock b/Cargo.lock index 5dab67119..42a4fa3c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1038,6 +1038,15 @@ dependencies = [ "itertools 0.10.5", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -1255,6 +1264,16 @@ dependencies = [ "windows-sys 0.61.0", ] +[[package]] +name = "diskus" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec07379c016f78e7ddcd953663b9ed17928ff384928d34d824ed7e463bd3d908" +dependencies = [ + "crossbeam-channel", + "rayon", +] + [[package]] name = "dispatch2" version = "0.3.0" @@ -3443,9 +3462,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -3453,9 +3472,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -5402,6 +5421,7 @@ dependencies = [ "clap", "console 0.16.1", "ctrlc", + "diskus", "dotenvy", "dunce", "embed-manifest", diff --git a/Cargo.toml b/Cargo.toml index b6a8912f4..f812b996f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,6 +103,7 @@ ctrlc = { version = "3.4.5" } cyclonedx-bom = { version = "0.8.0" } dashmap = { version = "6.1.0" } data-encoding = { version = "2.6.0" } +diskus = { version = "0.9.0", default-features = false } dotenvy = { version = "0.15.7" } dunce = { version = "1.0.5" } either = { version = "1.13.0" } diff --git a/crates/uv/Cargo.toml b/crates/uv/Cargo.toml index e3de5b629..97c0a5476 100644 --- a/crates/uv/Cargo.toml +++ b/crates/uv/Cargo.toml @@ -75,6 +75,7 @@ base64 = { workspace = true } clap = { workspace = true, features = ["derive", "string", "wrap_help"] } console = { workspace = true } ctrlc = { workspace = true } +diskus = { workspace = true } dotenvy = { workspace = true } dunce = { workspace = true } flate2 = { workspace = true, default-features = false } diff --git a/crates/uv/src/commands/cache_size.rs b/crates/uv/src/commands/cache_size.rs index dfeecfc9c..46ef3216d 100644 --- a/crates/uv/src/commands/cache_size.rs +++ b/crates/uv/src/commands/cache_size.rs @@ -1,6 +1,7 @@ use std::fmt::Write; use anyhow::Result; +use diskus::DiskUsage; use crate::commands::{ExitStatus, human_readable_bytes}; use crate::printer::Printer; @@ -31,16 +32,9 @@ pub(crate) fn cache_size( return Ok(ExitStatus::Success); } - // Walk the entire cache root - let total_bytes: u64 = walkdir::WalkDir::new(cache.root()) - .follow_links(false) - .into_iter() - .filter_map(Result::ok) - .filter_map(|entry| match entry.metadata() { - Ok(metadata) if metadata.is_file() => Some(metadata.len()), - _ => None, - }) - .sum(); + let disk_usage = DiskUsage::new(vec![cache.root().to_path_buf()]); + + let total_bytes = disk_usage.count_ignoring_errors(); if human_readable { let (bytes, unit) = human_readable_bytes(total_bytes);