diff --git a/crates/icp-cli/src/commands/network/start.rs b/crates/icp-cli/src/commands/network/start.rs index 8ea066d7..48346b08 100644 --- a/crates/icp-cli/src/commands/network/start.rs +++ b/crates/icp-cli/src/commands/network/start.rs @@ -1,3 +1,5 @@ +use std::sync::{Arc, OnceLock}; + use anyhow::{Context as _, bail}; use candid::Principal; use clap::Args; @@ -17,6 +19,8 @@ use icp::{ }; use tracing::{debug, info, warn}; +use crate::progress::{ProgressManager, ProgressManagerSettings}; + use super::args::NetworkOrEnvironmentArgs; use icp::context::Context; @@ -149,6 +153,7 @@ pub(crate) async fn exec(ctx: &Context, args: &StartArgs) -> Result<(), anyhow:: let autocontainerize = cfg!(windows) || settings.autocontainerize; // Acquire network launcher path, downloading it if necessary + let debug = ctx.debug; let network_launcher_path = if let Ok(var) = std::env::var("ICP_CLI_NETWORK_LAUNCHER_PATH") { // The user is overriding the launcher debug!("Network launcher path overridden by ICP_CLI_NETWORK_LAUNCHER_PATH={var}"); @@ -172,7 +177,27 @@ pub(crate) async fn exec(ctx: &Context, args: &StartArgs) -> Result<(), anyhow:: } else { // The version is not fresh or not cached, download it debug!("Downloading icp-cli-network-launcher version `{version}`"); - let (_, path) = download_launcher_version(pkg, version, &client).await?; + let progress_manager = + ProgressManager::new(ProgressManagerSettings { hidden: debug }); + let pb = progress_manager.create_independent_progress_bar(); + pb.set_message(format!("Downloading icp-cli-network-launcher {version}...")); + let version_slot: Arc> = Arc::new(OnceLock::new()); + let version_capture = version_slot.clone(); + let path = ProgressManager::execute_with_progress( + &pb, + async { + let (ver, path) = + download_launcher_version(pkg, version, &client).await?; + let _ = version_capture.set(ver); + anyhow::Ok(path) + }, + move || { + let ver = version_slot.get().map(String::as_str).unwrap(); + format!("Downloaded icp-cli-network-launcher {ver}") + }, + |err| format!("Failed to download icp-cli-network-launcher: {err}"), + ) + .await?; Ok(Some(path)) } }) diff --git a/crates/icp-cli/src/commands/network/update.rs b/crates/icp-cli/src/commands/network/update.rs index 90f907f0..7ff1c080 100644 --- a/crates/icp-cli/src/commands/network/update.rs +++ b/crates/icp-cli/src/commands/network/update.rs @@ -1,20 +1,39 @@ +use std::sync::{Arc, OnceLock}; + use clap::Parser; use icp::{context::Context, network::managed::cache::download_launcher_version}; -use tracing::info; + +use crate::progress::{ProgressManager, ProgressManagerSettings}; /// Update icp-cli-network-launcher to the latest version. #[derive(Parser, Debug)] pub struct UpdateArgs {} pub async fn exec(ctx: &Context, _args: &UpdateArgs) -> Result<(), anyhow::Error> { + let progress_manager = ProgressManager::new(ProgressManagerSettings { hidden: ctx.debug }); + let pb = progress_manager.create_independent_progress_bar(); + pb.set_message("Downloading latest icp-cli-network-launcher...".to_string()); + let pkg = ctx.dirs.package_cache()?; - let ver = pkg - .with_write(async |pkg| { - let (ver, _path) = - download_launcher_version(pkg, "latest", &reqwest::Client::new()).await?; - anyhow::Ok(ver) - }) - .await??; - info!("icp-cli-network-launcher has been updated to the latest version {ver}."); - Ok(()) + let version_slot: Arc> = Arc::new(OnceLock::new()); + let version_capture = version_slot.clone(); + + ProgressManager::execute_with_progress( + &pb, + async move { + pkg.with_write(async move |pkg| { + let (ver, _path) = + download_launcher_version(pkg, "latest", &reqwest::Client::new()).await?; + let _ = version_capture.set(ver); + anyhow::Ok(()) + }) + .await? + }, + move || { + let ver = version_slot.get().map(String::as_str).unwrap(); + format!("Updated icp-cli-network-launcher to {ver}") + }, + |err| format!("Failed to update icp-cli-network-launcher: {err}"), + ) + .await } diff --git a/crates/icp-cli/src/progress.rs b/crates/icp-cli/src/progress.rs index 88c64735..0a079599 100644 --- a/crates/icp-cli/src/progress.rs +++ b/crates/icp-cli/src/progress.rs @@ -93,6 +93,12 @@ impl ProgressManager { /// Create a new progress bar with standard configuration pub(crate) fn create_progress_bar(&self, canister_name: &str) -> SimpleProgressBar { + let pb = self.create_independent_progress_bar(); + pb.set_prefix(format!("[{canister_name}]")); + pb + } + + pub(crate) fn create_independent_progress_bar(&self) -> SimpleProgressBar { let pb = self .multi_progress .add(SimpleProgressBar::new_spinner().with_style(make_style( @@ -103,9 +109,6 @@ impl ProgressManager { // Auto-tick spinner pb.enable_steady_tick(Duration::from_millis(120)); - // Set the progress bar prefix to display the canister name in brackets - pb.set_prefix(format!("[{canister_name}]")); - pb }