Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions crates/quake/src/cli_version.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,12 @@ const V0_6_0: (u64, u64, u64) = (0, 6, 0);
/// Extract a `(major, minor, patch)` tuple from an image tag.
///
/// Returns `Some` only for explicit parseable versions such as `v0.6.0`,
/// `arc_consensus:v0.5.1-rc1`, or `0.7.0`. Returns `None` for missing tags,
/// the `"latest"` tag, or tags that do not fit the `MAJOR.MINOR.PATCH[-...]`
/// pattern. Callers decide how to interpret `None` — [`check_cli_version`]
/// distinguishes `latest` from unparsable, while [`apply_version_compat`]
/// treats every `None` uniformly as "assume the target supports every flag".
/// `arc_consensus:v0.5.1-rc1`, `v0.6.0+build.1`, or `0.7.0`. Returns `None`
/// for missing tags, the `"latest"` tag, or tags that do not fit the
/// `MAJOR.MINOR.PATCH[-...][+...]` pattern. Callers decide how to interpret
/// `None` — [`check_cli_version`] distinguishes `latest` from unparsable, while
/// [`apply_version_compat`] treats every `None` uniformly as "assume the target
/// supports every flag".
fn parse_image_semver(image_tag: Option<&str>) -> Option<(u64, u64, u64)> {
let tag = image_tag?;
let version_str = tag.rsplit(':').next().unwrap_or(tag);
Expand All @@ -107,7 +108,10 @@ fn parse_image_semver(image_tag: Option<&str>) -> Option<(u64, u64, u64)> {
}
let major = parts[0].parse::<u64>().ok()?;
let minor = parts[1].parse::<u64>().ok()?;
let patch_str = parts[2].split('-').next().unwrap_or(parts[2]);
let patch_str = parts[2]
.split(|c| c == '-' || c == '+')
.next()
.unwrap_or(parts[2]);
let patch = patch_str.parse::<u64>().ok()?;
Some((major, minor, patch))
}
Expand Down Expand Up @@ -246,7 +250,9 @@ mod tests {
fn supports_cli_flags_handles_prerelease_versions() {
assert!(supports_cli_flags(Some("v0.5.0-rc1")));
assert!(supports_cli_flags(Some("v0.5.0-beta")));
assert!(supports_cli_flags(Some("v0.5.0+build.1")));
assert!(!supports_cli_flags(Some("v0.4.0-rc1")));
assert!(!supports_cli_flags(Some("v0.4.0+build.1")));
}

/// Run `apply_version_compat` over `input` for the given `image_tag` and
Expand Down Expand Up @@ -294,6 +300,7 @@ mod tests {
"v0.6.0",
"0.6.0",
"v0.6.0-rc1",
"v0.6.0+build.1",
] {
let result = compat_flags(Some(tag));
assert!(
Expand All @@ -315,6 +322,7 @@ mod tests {
"v0.6.1",
"0.6.1",
"v0.6.1-rc1",
"v0.6.1+build.1",
"v0.7.0-beta",
] {
let result = compat_flags(Some(tag));
Expand Down