diff --git a/Cargo.lock b/Cargo.lock index ed2ef6e..12f229e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,6 +32,7 @@ dependencies = [ "miette", "octocrab", "once_cell", + "semver", "tar", "thiserror", "tokio", @@ -1223,6 +1224,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + [[package]] name = "serde" version = "1.0.200" diff --git a/Cargo.toml b/Cargo.toml index 83d101d..3a6c1a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ indoc = "2.0.5" miette = { version = "7.2.0", features = ["fancy"] } octocrab = "0.38.0" once_cell = "1.19.0" +semver = "1.0.23" tar = "0.4.40" thiserror = "1.0.58" tokio = { version = "1.37.0", features = ["full"] } diff --git a/src/cmd/install.rs b/src/cmd/install.rs index c74be4f..c144dc9 100644 --- a/src/cmd/install.rs +++ b/src/cmd/install.rs @@ -9,6 +9,7 @@ use tokio::fs::symlink_file as symlink; use flate2::read::GzDecoder; use http_body_util::BodyExt; use miette::IntoDiagnostic; +use semver::Version; use tar::Archive; use crate::{ @@ -76,7 +77,7 @@ impl Args { } }; - let asset_name = asset_name(&release.tag_name); + let asset_name = asset_name(&release.tag_name)?; let search_result = release .assets @@ -171,19 +172,43 @@ pub async fn latest() -> miette::Result<()> { Args::latest().exec().await } -fn asset_name(tag_name: &str) -> String { - let os = match env::consts::OS { - "macos" => "darwin", - "windows" => "win32", - os => os, - }; - - let arch = match env::consts::ARCH { - "x86" => "amd64", - "x86_64" => "amd64", - "aarch64" => "arm64", - arch => arch, - }; - - format!("aiken_{}_{}_{}.tar.gz", tag_name, os, arch) +fn asset_name(tag_name: &str) -> miette::Result { + let version = Version::parse(&tag_name.replace('v', "")).into_diagnostic()?; + + let cut_off = Version::parse("1.0.26-alpha").into_diagnostic()?; + + if version > cut_off { + let os = match env::consts::OS { + "macos" => "apple-darwin", + "windows" => "pc-windows-msvc", + "linux" => "unknown-linux-gnu", + os => os, + }; + + let arch = match env::consts::ARCH { + "x86" => "x86_64", + arch => arch, + }; + + let asset_name = format!("aiken-{}-{}.tar.gz", arch, os); + + Ok(asset_name) + } else { + let os = match env::consts::OS { + "macos" => "darwin", + "windows" => "win32", + os => os, + }; + + let arch = match env::consts::ARCH { + "x86" => "amd64", + "x86_64" => "amd64", + "aarch64" => "arm64", + arch => arch, + }; + + let asset_name = format!("aiken_{}_{}_{}.tar.gz", tag_name, os, arch); + + Ok(asset_name) + } }