summaryrefslogtreecommitdiff
path: root/cli/upgrade.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/upgrade.rs')
-rw-r--r--cli/upgrade.rs76
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(())
}