Skip to content

Commit

Permalink
fixup! fixup! Fixes #23687: Add version parsing to rudder-package
Browse files Browse the repository at this point in the history
Fixes #23687: Add version parsing to rudder-package
  • Loading branch information
Félix Dallidet committed Nov 3, 2023
1 parent b1aa248 commit 553d11a
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 52 deletions.
1 change: 1 addition & 0 deletions relay/sources/rudder-package/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions relay/sources/rudder-package/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ env_logger = "0.10.0"
log = "0.4.20"
lzma-rs = "0.3.0"
pretty_assertions = "1.4.0"
regex = "1.10.2"
rstest = "0.18.2"
serde = { version = "1.0.189", features = ["derive"] }
serde_ini = "0.2.0"
Expand Down
1 change: 1 addition & 0 deletions relay/sources/rudder-package/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ mod database;
mod plugin;
mod repo_index;
mod webapp_xml;
mod versions;

use std::path::Path;

Expand Down
213 changes: 161 additions & 52 deletions relay/sources/rudder-package/src/versions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
use std::str::FromStr;
use std::cmp::Ordering;
use regex::Regex;
use anyhow::{Context, Ok, Result, bail, Error};
use anyhow::{Ok, Result, bail, Error};

struct ArchiveVersion {
pub rudder_version: RudderVersion,
Expand All @@ -14,13 +14,12 @@ struct ArchiveVersion {
impl FromStr for ArchiveVersion {
type Err = Error;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let re = Regex::new(r"^(?<rudder_version>.*)-(?<plugin_version.*)$")?;
let caps = match re.captures(s) {
let split = match s.split_once('-') {
None => bail!("Unparsable rpkg version '{}'", s),
Some(c) => c
};
let rudder_version = RudderVersion::from_str(&caps["rudder_version"].to_string())?;
let plugin_version = PluginVersion::from_str(&caps["plugin_version"].to_string())?;
let rudder_version = RudderVersion::from_str(split.0)?;
let plugin_version = PluginVersion::from_str(split.1)?;
Ok(Self {
rudder_version,
plugin_version
Expand All @@ -30,15 +29,10 @@ impl FromStr for ArchiveVersion {

#[derive(PartialEq, Debug)]
enum RudderVersionMode {
Alpha { version: u16 },
AlphaNightly { version: u16 },
Beta { version: u16 },
BetaNightly { version: u16 },
Rc { version: u16 },
RcNightly { version: u16 },
Git { version: u32 },
Release,
ReleaseNightly
Alpha { version: u32 },
Beta { version: u32 },
Rc { version: u32 },
Final,
}

impl FromStr for RudderVersionMode {
Expand All @@ -49,70 +43,54 @@ impl FromStr for RudderVersionMode {
let beta_regex = Regex::new(r"^~beta(?<version>\d+).*")?;
let rc_regex = Regex::new(r"^~rc(?<version>\d+).*")?;
let git_regex = Regex::new(r"^~git(?<version>\d+)")?;
let is_nightly = Regex::new(r".*-SNAPSHOT$")?.is_match(s);
if s == "" {
return Ok(RudderVersionMode::Release)
} else if s == "SNAPSHOT" {
return Ok(RudderVersionMode::ReleaseNightly)
return Ok(RudderVersionMode::Final)
}
// Test if alpha
let _ = match alpha_regex.captures(s) {
None => (),
Some(c) => {
let version = c["version"].to_string().parse().unwrap();
if is_nightly {
return Ok(RudderVersionMode::Alpha { version })
} else {
return Ok(RudderVersionMode::AlphaNightly { version })
}
return Ok(RudderVersionMode::Alpha { version })
}
};
// Test if beta
let _ = match beta_regex.captures(s) {
None => (),
Some(c) => {
let version = c["version"].to_string().parse().unwrap();
if is_nightly {
return Ok(RudderVersionMode::Beta { version })
} else {
return Ok(RudderVersionMode::BetaNightly { version })
}
return Ok(RudderVersionMode::Beta { version })
}
};
// Test if rc
let _ = match rc_regex.captures(s) {
None => (),
Some(c) => {
let version = c["version"].to_string().parse().unwrap();
if is_nightly {
return Ok(RudderVersionMode::Rc { version })
} else {
return Ok(RudderVersionMode::RcNightly { version })
}
return Ok(RudderVersionMode::Rc { version })
}
};
// Test if git
let _ = match git_regex.captures(s) {
None => (),
Some(c) => {
let version = c["version"].to_string().parse().unwrap();
return Ok(RudderVersionMode::Git { version })
}
None => (),
Some(_) => {
return Ok(RudderVersionMode::Final)
}
};
bail!("Unparsable Rudder version mode '{}'", s)
}
}

// Checking if a rudder version is a nightly or not is not important for plugin compatibility
// So it is not implemented
#[derive(PartialEq, Debug)]
struct RudderVersion {
pub major: u16,
pub minor: u16,
pub patch: u16,
pub major: u32,
pub minor: u32,
pub patch: u32,
pub mode: RudderVersionMode,
pub raw_version: String,
}


impl FromStr for RudderVersion {
type Err = Error;

Expand All @@ -122,18 +100,16 @@ impl FromStr for RudderVersion {
None => bail!("Unparsable rudder version '{}'", raw),
Some(c) => c
};
let major: u16 = u16::from_str(&caps["major"].to_string())?;
let minor: u16 = u16::from_str(&caps["minor"].to_string())?;
let patch: u16 = u16::from_str(&caps["patch"].to_string())?;
let major: u32 = caps["major"].parse()?;
let minor: u32 = caps["minor"].parse()?;
let patch: u32 = caps["patch"].parse()?;
let mode: RudderVersionMode = RudderVersionMode::from_str(&caps["mode"])?;
let raw_version = String::from(raw);

Ok(RudderVersion {
major,
minor,
patch,
mode,
raw_version
})
}
}
Expand All @@ -144,18 +120,19 @@ struct PluginVersion {
pub minor: u32,
pub nightly: bool
}

impl FromStr for PluginVersion {
type Err = Error;

fn from_str(raw: &str) -> Result<Self, Self::Err> {
let is_nightly = Regex::new(r".*-nightly$")?.is_match(raw);
let re = Regex::new(r"^(?<major>\d+)\.(?<minor>\d+).*$")?;
let re = Regex::new(r"^(?<major>\d+)\.(?<minor>\d+)(-nightly)?$")?;
let caps = match re.captures(raw) {
None => bail!("Unparsable plugin version '{}'", raw),
Some(c) => c
};
let major: u32 = u32::from_str(&caps["major"].to_string())?;
let minor: u32 = u32::from_str(&caps["minor"].to_string())?;
let major: u32 = caps["major"].parse()?;
let minor: u32 = caps["minor"].parse()?;

Ok(PluginVersion {
major: major,
Expand Down Expand Up @@ -194,7 +171,7 @@ mod tests {
#[case("7.0.0~alpha2", 7, 0, 0, "~alpha2")]
#[case("7.0.0", 7, 0, 0, "")]
#[case("8.0.1~rc1", 8, 0, 1, "~rc1")]
fn test_rudder_version_parsing(#[case] raw: &str, #[case] e_major: u16, #[case] e_minor: u16, #[case] e_patch: u16, #[case] e_mode: &str) {
fn test_rudder_version_parsing(#[case] raw: &str, #[case] e_major: u32, #[case] e_minor: u32, #[case] e_patch: u32, #[case] e_mode: &str) {
let v = RudderVersion::from_str(raw).unwrap();
assert_eq!(v.major, e_major);
assert_eq!(v.minor, e_minor);
Expand Down Expand Up @@ -228,4 +205,136 @@ mod tests {
right
);
}
#[rstest]
#[case("8.0.0-1.1")]
#[case("8.0.0-1.1-nightly")]
#[case("8.0.0-1.12")]
#[case("8.0.0-1.12-nightly")]
#[case("8.0.0-2.0-nightly")]
#[case("8.0.0-2.1")]
#[case("8.0.0-2.1-nightly")]
#[case("8.0.0-2.2")]
#[case("8.0.0-2.2-nightly")]
#[case("8.0.0-2.3")]
#[case("8.0.0-2.4")]
#[case("8.0.0-2.4-nightly")]
#[case("8.0.0-2.7")]
#[case("8.0.0-2.9")]
#[case("8.0.0-2.9-nightly")]
#[case("8.0.0~alpha1-1.1")]
#[case("8.0.0~alpha1-1.1-nightly")]
#[case("8.0.0~alpha1-1.12")]
#[case("8.0.0~alpha1-1.12-nightly")]
#[case("8.0.0~alpha1-2.0-nightly")]
#[case("8.0.0~alpha1-2.1")]
#[case("8.0.0~alpha1-2.1-nightly")]
#[case("8.0.0~alpha1-2.2")]
#[case("8.0.0~alpha1-2.2-nightly")]
#[case("8.0.0~alpha1-2.3")]
#[case("8.0.0~alpha1-2.4")]
#[case("8.0.0~alpha1-2.4-nightly")]
#[case("8.0.0~alpha1-2.6")]
#[case("8.0.0~alpha1-2.9")]
#[case("8.0.0~alpha1-2.9-nightly")]
#[case("8.0.0~alpha2-2.0-nightly")]
#[case("8.0.0~alpha2-2.1-nightly")]
#[case("8.0.0~alpha2-2.2-nightly")]
#[case("8.0.0~beta1-1.1")]
#[case("8.0.0~beta1-1.1-nightly")]
#[case("8.0.0~beta1-1.12")]
#[case("8.0.0~beta1-1.12-nightly")]
#[case("8.0.0~beta1-2.1")]
#[case("8.0.0~beta1-2.1-nightly")]
#[case("8.0.0~beta1-2.2")]
#[case("8.0.0~beta1-2.3")]
#[case("8.0.0~beta1-2.4")]
#[case("8.0.0~beta1-2.4-nightly")]
#[case("8.0.0~beta1-2.7")]
#[case("8.0.0~beta1-2.9")]
#[case("8.0.0~beta1-2.9-nightly")]
#[case("8.0.0~beta2-1.1")]
#[case("8.0.0~beta2-1.1-nightly")]
#[case("8.0.0~beta2-1.12")]
#[case("8.0.0~beta2-1.12-nightly")]
#[case("8.0.0~beta2-2.0-nightly")]
#[case("8.0.0~beta2-2.1")]
#[case("8.0.0~beta2-2.1-nightly")]
#[case("8.0.0~beta2-2.2")]
#[case("8.0.0~beta2-2.2-nightly")]
#[case("8.0.0~beta2-2.3")]
#[case("8.0.0~beta2-2.4")]
#[case("8.0.0~beta2-2.4-nightly")]
#[case("8.0.0~beta2-2.7")]
#[case("8.0.0~beta2-2.9")]
#[case("8.0.0~beta2-2.9-nightly")]
#[case("8.0.0~beta3-1.1")]
#[case("8.0.0~beta3-1.1-nightly")]
#[case("8.0.0~beta3-1.12")]
#[case("8.0.0~beta3-1.12-nightly")]
#[case("8.0.0~beta3-2.1")]
#[case("8.0.0~beta3-2.1-nightly")]
#[case("8.0.0~beta3-2.2")]
#[case("8.0.0~beta3-2.3")]
#[case("8.0.0~beta3-2.4")]
#[case("8.0.0~beta3-2.4-nightly")]
#[case("8.0.0~beta3-2.7")]
#[case("8.0.0~beta3-2.9")]
#[case("8.0.0~beta3-2.9-nightly")]
#[case("8.0.0~beta4-2.0-nightly")]
#[case("8.0.0~beta4-2.1-nightly")]
#[case("8.0.0~beta4-2.2-nightly")]
#[case("8.0.0~rc1-1.1")]
#[case("8.0.0~rc1-1.1-nightly")]
#[case("8.0.0~rc1-1.12")]
#[case("8.0.0~rc1-1.12-nightly")]
#[case("8.0.0~rc1-2.0-nightly")]
#[case("8.0.0~rc1-2.1")]
#[case("8.0.0~rc1-2.1-nightly")]
#[case("8.0.0~rc1-2.2")]
#[case("8.0.0~rc1-2.2-nightly")]
#[case("8.0.0~rc1-2.3")]
#[case("8.0.0~rc1-2.4")]
#[case("8.0.0~rc1-2.4-nightly")]
#[case("8.0.0~rc1-2.7")]
#[case("8.0.0~rc1-2.9")]
#[case("8.0.0~rc1-2.9-nightly")]
#[case("8.0.0~rc2-1.1")]
#[case("8.0.0~rc2-1.1-nightly")]
#[case("8.0.0~rc2-1.12")]
#[case("8.0.0~rc2-1.12-nightly")]
#[case("8.0.0~rc2-2.0-nightly")]
#[case("8.0.0~rc2-2.1")]
#[case("8.0.0~rc2-2.1-nightly")]
#[case("8.0.0~rc2-2.2")]
#[case("8.0.0~rc2-2.2-nightly")]
#[case("8.0.0~rc2-2.3")]
#[case("8.0.0~rc2-2.4")]
#[case("8.0.0~rc2-2.4-nightly")]
#[case("8.0.0~rc2-2.7")]
#[case("8.0.0~rc2-2.9")]
#[case("8.0.0~rc2-2.9-nightly")]
#[case("8.0.0~rc3-2.0-nightly")]
#[case("8.0.0~rc3-2.1-nightly")]
#[case("8.0.0~rc3-2.2-nightly")]
#[case("8.0.1-1.1")]
#[case("8.0.1-1.1-nightly")]
#[case("8.0.1-1.12")]
#[case("8.0.1-1.12-nightly")]
#[case("8.0.1-2.0-nightly")]
#[case("8.0.1-2.1")]
#[case("8.0.1-2.1-nightly")]
#[case("8.0.1-2.2")]
#[case("8.0.1-2.2-nightly")]
#[case("8.0.1-2.3")]
#[case("8.0.1-2.4")]
#[case("8.0.1-2.4-nightly")]
#[case("8.0.1-2.7")]
#[case("8.0.1-2.9")]
#[case("8.0.1-2.9-nightly")]
#[case("8.0.2-2.0-nightly")]
#[case("8.0.2-2.1-nightly")]
#[case("8.0.2-2.2-nightly")]
fn test_rpkg_version(#[case] a: &str) {
let _ = ArchiveVersion::from_str(a).unwrap();
}
}

0 comments on commit 553d11a

Please sign in to comment.