summaryrefslogtreecommitdiff
path: root/cli/tools/upgrade.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2024-08-19 16:05:10 +0100
committerGitHub <noreply@github.com>2024-08-19 17:05:10 +0200
commitc94c5cddb137069640fc9fc61435204d6f63fc5d (patch)
tree78e5e7a9679a3a9937175ca57e1c4389c21a9933 /cli/tools/upgrade.rs
parentc0aa68a1e2a34777c01fd6f718b7718b14e3a18d (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.rs134
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(