diff options
Diffstat (limited to 'cli/upgrade.rs')
-rw-r--r-- | cli/upgrade.rs | 76 |
1 files changed, 52 insertions, 24 deletions
diff --git a/cli/upgrade.rs b/cli/upgrade.rs index 519f8d6bc..b4f207643 100644 --- a/cli/upgrade.rs +++ b/cli/upgrade.rs @@ -52,36 +52,64 @@ async fn get_latest_version(client: &Client) -> Result<Version, ErrBox> { /// Asynchronously updates deno executable to greatest version /// if greatest version is available. -pub async fn upgrade_command(dry_run: bool, force: bool) -> Result<(), ErrBox> { +pub async fn upgrade_command( + dry_run: bool, + force: bool, + version: Option<String>, +) -> Result<(), ErrBox> { let client = Client::builder().redirect(Policy::none()).build()?; - let latest_version = get_latest_version(&client).await?; let current_version = semver_parse(crate::version::DENO).unwrap(); - if !force && current_version >= latest_version { - println!( - "Local deno version {} is the most recent release", - &crate::version::DENO - ); - } else { - println!( - "New version has been found\nDeno is upgrading to version {}", - &latest_version - ); - let archive_data = - download_package(&compose_url_to_exec(&latest_version)?, client).await?; - - let old_exe_path = std::env::current_exe()?; - let new_exe_path = unpack(archive_data)?; - let permissions = fs::metadata(&old_exe_path)?.permissions(); - fs::set_permissions(&new_exe_path, permissions)?; - check_exe(&new_exe_path, &latest_version)?; - - if !dry_run { - replace_exe(&new_exe_path, &old_exe_path)?; + let install_version = match version { + Some(passed_version) => match semver_parse(&passed_version) { + Ok(ver) => { + if !force && current_version == ver { + println!("Version {} is already installed", &ver); + std::process::exit(1) + } else { + ver + } + } + Err(_) => { + eprintln!("Invalid semver passed"); + std::process::exit(1) + } + }, + None => { + let latest_version = get_latest_version(&client).await?; + + if !force && current_version >= latest_version { + println!( + "Local deno version {} is the most recent release", + &crate::version::DENO + ); + std::process::exit(1) + } else { + latest_version + } } + }; - println!("Upgrade done successfully") + println!( + "Version has been found\nDeno is upgrading to version {}", + &install_version + ); + + let archive_data = + download_package(&compose_url_to_exec(&install_version)?, client).await?; + + let old_exe_path = std::env::current_exe()?; + let new_exe_path = unpack(archive_data)?; + let permissions = fs::metadata(&old_exe_path)?.permissions(); + fs::set_permissions(&new_exe_path, permissions)?; + check_exe(&new_exe_path, &install_version)?; + + if !dry_run { + replace_exe(&new_exe_path, &old_exe_path)?; } + + println!("Upgrade done successfully"); + Ok(()) } |