use crate::utils::get_platform;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ArtifactKind {
Gui,
Cli,
Deb,
Rpm,
}
pub fn release_file_name(
version: &str,
branch: &str,
os: &str,
arch: &str,
kind: ArtifactKind,
) -> Option<String> {
let file_arch = match (os, arch) {
("android", "aarch64") => "arm64",
_ => arch,
};
let platform = format!("{os}-{file_arch}");
let name = match (os, arch, kind) {
("linux", _, ArtifactKind::Cli) => format!("clo-{version}-{branch}-{platform}.tar.gz"),
("linux", "x86_64", ArtifactKind::Deb) => {
format!("cloudpub-{version}-{branch}-{platform}.deb")
}
("linux", "x86_64", ArtifactKind::Rpm) => {
format!("cloudpub-{version}-{branch}-{platform}.rpm")
}
("macos", _, ArtifactKind::Gui) => format!("cloudpub-{version}-{branch}-{platform}.dmg"),
("macos", _, ArtifactKind::Cli) => format!("clo-{version}-{branch}-{platform}.tar.gz"),
("windows", "x86_64", ArtifactKind::Gui) => {
format!("cloudpub-{version}-{branch}-{platform}.msi")
}
("windows", "x86_64", ArtifactKind::Cli) => {
format!("clo-{version}-{branch}-{platform}.zip")
}
("android", "aarch64", ArtifactKind::Cli) => {
format!("clo-{version}-{branch}-{platform}.tar.gz")
}
_ => return None,
};
Some(name)
}
pub fn agent_platform_parts(agent_platform: &str) -> Option<(&'static str, &'static str)> {
match agent_platform {
"linux-x86_64" => Some(("linux", "x86_64")),
"linux-i686" => Some(("linux", "i686")),
"linux-aarch64" => Some(("linux", "aarch64")),
"linux-armv7" => Some(("linux", "arm")),
"linux-mips" => Some(("linux", "mips")),
"linux-mipsel" => Some(("linux", "mipsel")),
"macos-x86_64" => Some(("macos", "x86_64")),
"macos-aarch64" => Some(("macos", "aarch64")),
"windows-x86_64" => Some(("windows", "x86_64")),
"windows-i686" => Some(("windows", "i686")),
"android-aarch64" => Some(("android", "aarch64")),
_ => None,
}
}
pub fn current_platform() -> String {
get_platform()
}
#[cfg(test)]
mod tests {
use super::*;
const V: &str = "3.5.1126";
const B: &str = "beta";
fn name(os: &str, arch: &str, kind: ArtifactKind) -> Option<String> {
release_file_name(V, B, os, arch, kind)
}
#[test]
fn file_names_are_exactly_the_clients_download_scheme() {
assert_eq!(
name("macos", "aarch64", ArtifactKind::Gui),
Some("cloudpub-3.5.1126-beta-macos-aarch64.dmg".to_string())
);
assert_eq!(
name("macos", "aarch64", ArtifactKind::Cli),
Some("clo-3.5.1126-beta-macos-aarch64.tar.gz".to_string())
);
assert_eq!(
name("macos", "x86_64", ArtifactKind::Gui),
Some("cloudpub-3.5.1126-beta-macos-x86_64.dmg".to_string())
);
assert_eq!(
name("macos", "x86_64", ArtifactKind::Cli),
Some("clo-3.5.1126-beta-macos-x86_64.tar.gz".to_string())
);
assert_eq!(
name("windows", "x86_64", ArtifactKind::Gui),
Some("cloudpub-3.5.1126-beta-windows-x86_64.msi".to_string())
);
assert_eq!(
name("windows", "x86_64", ArtifactKind::Cli),
Some("clo-3.5.1126-beta-windows-x86_64.zip".to_string())
);
for arch in [
"arm", "armv5te", "aarch64", "mips", "mipsel", "i686", "x86_64",
] {
assert_eq!(
name("linux", arch, ArtifactKind::Cli),
Some(format!("clo-3.5.1126-beta-linux-{arch}.tar.gz")),
"the linux {arch} CLI archive name changed"
);
}
assert_eq!(
name("linux", "x86_64", ArtifactKind::Deb),
Some("cloudpub-3.5.1126-beta-linux-x86_64.deb".to_string())
);
assert_eq!(
name("linux", "x86_64", ArtifactKind::Rpm),
Some("cloudpub-3.5.1126-beta-linux-x86_64.rpm".to_string())
);
assert_eq!(
name("android", "aarch64", ArtifactKind::Cli),
Some("clo-3.5.1126-beta-android-arm64.tar.gz".to_string())
);
assert_eq!(name("linux", "x86_64", ArtifactKind::Gui), None);
for kind in [ArtifactKind::Deb, ArtifactKind::Rpm] {
assert_eq!(name("macos", "aarch64", kind), None);
assert_eq!(name("windows", "x86_64", kind), None);
assert_eq!(name("android", "aarch64", kind), None);
}
for kind in [ArtifactKind::Gui, ArtifactKind::Deb, ArtifactKind::Rpm] {
assert_eq!(name("linux", "aarch64", kind), None);
assert_eq!(name("linux", "arm", kind), None);
assert_eq!(name("linux", "i686", kind), None);
}
assert_eq!(name("windows", "i686", ArtifactKind::Cli), None);
assert_eq!(name("plan9", "x86_64", ArtifactKind::Cli), None);
}
#[test]
fn agent_platforms_map_to_the_download_selection_pairs() {
let cases = [
("linux-x86_64", ("linux", "x86_64")),
("linux-i686", ("linux", "i686")),
("linux-aarch64", ("linux", "aarch64")),
("linux-armv7", ("linux", "arm")),
("linux-mips", ("linux", "mips")),
("linux-mipsel", ("linux", "mipsel")),
("macos-x86_64", ("macos", "x86_64")),
("macos-aarch64", ("macos", "aarch64")),
("windows-x86_64", ("windows", "x86_64")),
("windows-i686", ("windows", "i686")),
("android-aarch64", ("android", "aarch64")),
];
for (report, expected) in cases {
assert_eq!(
agent_platform_parts(report),
Some(expected),
"the agent report {report} must select the {expected:?} downloads"
);
}
assert_eq!(agent_platform_parts("linux-armv6"), None);
assert_eq!(agent_platform_parts(""), None);
}
#[test]
fn every_reported_platform_resolves_to_a_download_pair() {
for report in [
"linux-x86_64",
"linux-armv7",
"linux-aarch64",
"linux-i686",
"linux-mips",
"linux-mipsel",
"windows-x86_64",
"windows-i686",
"macos-x86_64",
"macos-aarch64",
"android-aarch64",
] {
assert!(
agent_platform_parts(report).is_some(),
"no download selection for the reported platform {report}"
);
}
}
}