From f003d6498ca36d80d98c870b73fbaa8ad1b31531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sun, 18 Aug 2024 23:29:59 +0100 Subject: fix(upgrade): correctly compute latest version based on current release channel (#25087) This commit fixes computation of the latest available version by taking into account which release channel the current binary is on. Before this commit, if user was on "RC" channel, calling `deno upgrade` would not switch back to the "stable" channel. --- cli/tools/upgrade.rs | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) (limited to 'cli/tools') diff --git a/cli/tools/upgrade.rs b/cli/tools/upgrade.rs index 4a3b97de1..844d7b677 100644 --- a/cli/tools/upgrade.rs +++ b/cli/tools/upgrade.rs @@ -543,6 +543,7 @@ pub async fn upgrade( Ok(()) } +#[derive(Debug)] enum RequestedVersion { Latest(ReleaseChannel), SpecificVersion(ReleaseChannel, String), @@ -662,24 +663,45 @@ async fn find_latest_version_to_upgrade( .await?; let (maybe_newer_latest_version, current_version) = match release_channel { - ReleaseChannel::Stable | ReleaseChannel::Rc => { + ReleaseChannel::Stable => { let current_version = version::DENO_VERSION_INFO.deno; - let current_is_most_recent = if version::DENO_VERSION_INFO.release_channel - != ReleaseChannel::Canary - { + + // If the current binary is not a stable channel, we can skip + // computation if we're on a newer release - we're not. + if version::DENO_VERSION_INFO.release_channel != ReleaseChannel::Stable { + (Some(latest_version_found), current_version) + } else { let current = Version::parse_standard(current_version).unwrap(); let latest = Version::parse_standard(&latest_version_found.version_or_hash) .unwrap(); - current >= latest - } else { - false - }; + let current_is_most_recent = current >= latest; - if !force && current_is_most_recent { - (None, current_version) - } else { + if !force && current_is_most_recent { + (None, current_version) + } else { + (Some(latest_version_found), current_version) + } + } + } + ReleaseChannel::Rc => { + let current_version = version::DENO_VERSION_INFO.deno; + + // If the current binary is not an rc channel, we can skip + // computation if we're on a newer release - we're not. + if version::DENO_VERSION_INFO.release_channel != ReleaseChannel::Rc { (Some(latest_version_found), current_version) + } else { + let current = Version::parse_standard(current_version).unwrap(); + let latest = + Version::parse_standard(&latest_version_found.version_or_hash) + .unwrap(); + let current_is_most_recent = current >= latest; + if !force && current_is_most_recent { + (None, current_version) + } else { + (Some(latest_version_found), current_version) + } } } ReleaseChannel::Canary => { -- cgit v1.2.3