diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2024-08-19 16:05:10 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-19 17:05:10 +0200 |
commit | c94c5cddb137069640fc9fc61435204d6f63fc5d (patch) | |
tree | 78e5e7a9679a3a9937175ca57e1c4389c21a9933 /cli/tools/upgrade.rs | |
parent | c0aa68a1e2a34777c01fd6f718b7718b14e3a18d (diff) |
feat(upgrade): support `deno upgrade 1.46.0` (#25096)
This commit changes `deno upgrade` subcommand to accept
a positional argument that can be either a version, release channel
name or a git hash, making invocations of `deno upgrade` much
more concise:
```
# before
$ deno upgrade --version 1.46.0
# after
$ deno upgrade 1.46.0
```
```
# before
$ deno upgrade --canary
# after
$ deno upgrade canary
```
```
# specific canary version before
$ deno upgrade --canary --version f042c39180c1b345de8e7b5f0dfae5d0a49b161f
# after
$ deno upgrade f042c39180c1b345de8e7b5f0dfae5d0a49b161f
```
Old flags are still supported, but hidden from the help output.
Diffstat (limited to 'cli/tools/upgrade.rs')
-rw-r--r-- | cli/tools/upgrade.rs | 134 |
1 files changed, 123 insertions, 11 deletions
diff --git a/cli/tools/upgrade.rs b/cli/tools/upgrade.rs index dba573e26..db43b8be1 100644 --- a/cli/tools/upgrade.rs +++ b/cli/tools/upgrade.rs @@ -547,7 +547,7 @@ pub async fn upgrade( Ok(()) } -#[derive(Debug)] +#[derive(Debug, PartialEq)] enum RequestedVersion { Latest(ReleaseChannel), SpecificVersion(ReleaseChannel, String), @@ -556,20 +556,34 @@ enum RequestedVersion { impl RequestedVersion { fn from_upgrade_flags(upgrade_flags: UpgradeFlags) -> Result<Self, AnyError> { let is_canary = upgrade_flags.canary; - let is_release_candidate = upgrade_flags.release_candidate; - - let Some(passed_version) = upgrade_flags.version else { - let channel = if is_canary { - ReleaseChannel::Canary - } else if is_release_candidate { - ReleaseChannel::Rc + let re_hash = lazy_regex::regex!("^[0-9a-f]{40}$"); + let channel = if is_canary { + ReleaseChannel::Canary + } else if upgrade_flags.release_candidate { + ReleaseChannel::Rc + } else { + ReleaseChannel::Stable + }; + let mut maybe_passed_version = upgrade_flags.version.clone(); + + if let Some(val) = &upgrade_flags.version_or_hash_or_channel { + if let Ok(channel) = ReleaseChannel::deserialize(&val.to_lowercase()) { + // TODO(bartlomieju): print error if any other flags passed? + return Ok(Self::Latest(channel)); + } else if re_hash.is_match(val) { + return Ok(Self::SpecificVersion( + ReleaseChannel::Canary, + val.to_string(), + )); } else { - ReleaseChannel::Stable - }; + maybe_passed_version = Some(val.to_string()); + } + } + + let Some(passed_version) = maybe_passed_version else { return Ok(Self::Latest(channel)); }; - let re_hash = lazy_regex::regex!("^[0-9a-f]{40}$"); let passed_version = passed_version .strip_prefix('v') .unwrap_or(&passed_version) @@ -1040,6 +1054,104 @@ mod test { use super::*; #[test] + fn test_requested_version() { + let mut upgrade_flags = UpgradeFlags { + dry_run: false, + force: false, + release_candidate: false, + canary: false, + version: None, + output: None, + version_or_hash_or_channel: None, + }; + + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!(req_ver, RequestedVersion::Latest(ReleaseChannel::Stable)); + + upgrade_flags.version = Some("1.46.0".to_string()); + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!( + req_ver, + RequestedVersion::SpecificVersion( + ReleaseChannel::Stable, + "1.46.0".to_string() + ) + ); + + upgrade_flags.version = None; + upgrade_flags.canary = true; + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!(req_ver, RequestedVersion::Latest(ReleaseChannel::Canary)); + + upgrade_flags.version = + Some("5c69b4861b52ab406e73b9cd85c254f0505cb20f".to_string()); + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!( + req_ver, + RequestedVersion::SpecificVersion( + ReleaseChannel::Canary, + "5c69b4861b52ab406e73b9cd85c254f0505cb20f".to_string() + ) + ); + + upgrade_flags.version = None; + upgrade_flags.canary = false; + upgrade_flags.release_candidate = true; + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!(req_ver, RequestedVersion::Latest(ReleaseChannel::Rc)); + + upgrade_flags.release_candidate = false; + upgrade_flags.version_or_hash_or_channel = Some("v1.46.5".to_string()); + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!( + req_ver, + RequestedVersion::SpecificVersion( + ReleaseChannel::Stable, + "1.46.5".to_string() + ) + ); + + upgrade_flags.version_or_hash_or_channel = Some("2.0.0-rc.0".to_string()); + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!( + req_ver, + RequestedVersion::SpecificVersion( + ReleaseChannel::Rc, + "2.0.0-rc.0".to_string() + ) + ); + + upgrade_flags.version_or_hash_or_channel = Some("canary".to_string()); + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!(req_ver, RequestedVersion::Latest(ReleaseChannel::Canary,)); + + upgrade_flags.version_or_hash_or_channel = Some("rc".to_string()); + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!(req_ver, RequestedVersion::Latest(ReleaseChannel::Rc,)); + + upgrade_flags.version_or_hash_or_channel = + Some("5c69b4861b52ab406e73b9cd85c254f0505cb20f".to_string()); + let req_ver = + RequestedVersion::from_upgrade_flags(upgrade_flags.clone()).unwrap(); + assert_eq!( + req_ver, + RequestedVersion::SpecificVersion( + ReleaseChannel::Canary, + "5c69b4861b52ab406e73b9cd85c254f0505cb20f".to_string() + ) + ); + } + + #[test] fn test_parse_upgrade_check_file() { // NOTE(bartlomieju): pre-1.46 format let maybe_file = CheckVersionFile::parse( |