From 70c8955b449317c723cbe6eb8cc4c6722e34cf2b Mon Sep 17 00:00:00 2001 From: messense Date: Sat, 21 Dec 2024 18:06:29 +0800 Subject: [PATCH 1/2] Add progress bar for sysroot download --- src/compiler/clang.rs | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/compiler/clang.rs b/src/compiler/clang.rs index 85c5dd5..72271e5 100644 --- a/src/compiler/clang.rs +++ b/src/compiler/clang.rs @@ -154,9 +154,16 @@ impl<'a> Clang<'a> { fn setup_msvc_sysroot(&self, cache_dir: PathBuf) -> Result { let msvc_sysroot_dir = cache_dir.join("windows-msvc-sysroot"); + let done_mark_file = msvc_sysroot_dir.join("DONE"); if msvc_sysroot_dir.is_dir() { - // Already downloaded and unpacked - return Ok(msvc_sysroot_dir); + if done_mark_file.is_file() { + // Already downloaded and unpacked + return Ok(msvc_sysroot_dir); + } else { + // Download again + fs::remove_dir_all(&msvc_sysroot_dir) + .context("Failed to remove existing msvc sysroot")?; + } } let agent = http_agent()?; @@ -166,6 +173,7 @@ impl<'a> Clang<'a> { .unwrap_or_else(|_| FALLBACK_DOWNLOAD_URL.to_string()); self.download_msvc_sysroot(&cache_dir, agent, &download_url) .context("Failed to unpack msvc sysroot")?; + fs::write(done_mark_file, download_url)?; Ok(msvc_sysroot_dir) } @@ -203,12 +211,30 @@ impl<'a> Clang<'a> { agent: ureq::Agent, download_url: &str, ) -> Result<()> { + use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle}; use xz2::read::XzDecoder; let response = agent.get(download_url).call()?; - let tar = XzDecoder::new(response.into_reader()); + let len = response + .header("content-length") + .and_then(|s| s.parse::().ok()) + .unwrap_or(0); + let pb = ProgressBar::new(len); + pb.set_draw_target(ProgressDrawTarget::stdout()); + pb.set_style( + ProgressStyle::default_bar() + .template( + "{spinner:.green} {prefix:.bold} [{elapsed}] {wide_bar:.green} {bytes}/{total_bytes} {msg}", + )? + .progress_chars("=> "), + ); + pb.set_prefix("sysroot"); + pb.set_message("⏬ Downloading"); + let reader = pb.wrap_read(response.into_reader()); + let tar = XzDecoder::new(reader); let mut archive = tar::Archive::new(tar); archive.unpack(cache_dir)?; + pb.finish_with_message("Download completed"); Ok(()) } From 29c68706bf02b82b9858970cc4dbb557645dfc8e Mon Sep 17 00:00:00 2001 From: messense Date: Sat, 21 Dec 2024 18:17:22 +0800 Subject: [PATCH 2/2] Print messages on non-interactive downloads --- src/compiler/clang.rs | 6 ++++++ src/compiler/clang_cl.rs | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/compiler/clang.rs b/src/compiler/clang.rs index 72271e5..f643513 100644 --- a/src/compiler/clang.rs +++ b/src/compiler/clang.rs @@ -230,11 +230,17 @@ impl<'a> Clang<'a> { ); pb.set_prefix("sysroot"); pb.set_message("⏬ Downloading"); + if pb.is_hidden() { + eprintln!("⏬ Start downloading MSVC sysroot..."); + } let reader = pb.wrap_read(response.into_reader()); let tar = XzDecoder::new(reader); let mut archive = tar::Archive::new(tar); archive.unpack(cache_dir)?; pb.finish_with_message("Download completed"); + if pb.is_hidden() { + eprintln!("✅ Finished downloading MSVC sysroot."); + } Ok(()) } diff --git a/src/compiler/clang_cl.rs b/src/compiler/clang_cl.rs index b8ccff9..f10b86e 100644 --- a/src/compiler/clang_cl.rs +++ b/src/compiler/clang_cl.rs @@ -309,6 +309,9 @@ impl<'a> ClangCl<'a> { .collect(); mp.set_move_cursor(true); + if mp.is_hidden() { + eprintln!("⏬ Start downloading MSVC CRT..."); + } ctx.execute( pkgs, work_items, @@ -335,6 +338,9 @@ impl<'a> ClangCl<'a> { if unpack.exists() { let _ = fs::remove_dir_all(unpack); } + if mp.is_hidden() { + eprintln!("✅ Finished downloading MSVC CRT."); + } Ok(()) }