Add a stable TUI/app-server version comparison helper (#43619)

## What changed

Add `is_official_server_older` to check whether a stable TUI version is newer than the app-server version. Require both versions to contain exactly three numeric components without leading zeros, and return `false` for source builds (`0.0.0`), prereleases, and malformed versions.

## Testing

Add unit coverage for older, equal, and newer server versions, plus invalid versions in either argument.

GitOrigin-RevId: afcc90b56e188df1bf410c69ca238765b4658000
This commit is contained in:
Eric Traut
2026-09-07 23:16:19 +00:00
committed by copyberry
parent 8e694e955a
commit c977cc0c19

View File

@@ -16,6 +16,32 @@ pub(crate) fn is_source_build_version(version: &str) -> bool {
parse_version(version) == Some((0, 0, 0))
}
/// Whether an official stable TUI release is newer than the connected app server.
pub(crate) fn is_official_server_older(client: &str, server: &str) -> bool {
fn stable_version(version: &str) -> Option<(u64, u64, u64)> {
fn component(value: Option<&str>) -> Option<u64> {
let value = value?;
if value.is_empty()
|| !value.bytes().all(|byte| byte.is_ascii_digit())
|| (value.len() > 1 && value.starts_with('0'))
{
return None;
}
value.parse().ok()
}
let mut parts = version.split('.');
let version = (
component(parts.next())?,
component(parts.next())?,
component(parts.next())?,
);
(parts.next().is_none() && version != (0, 0, 0)).then_some(version)
}
matches!((stable_version(client), stable_version(server)), (Some(client), Some(server)) if client > server)
}
fn parse_version(v: &str) -> Option<(u64, u64, u64)> {
let mut iter = v.trim().split('.');
let maj = iter.next()?.parse::<u64>().ok()?;
@@ -67,4 +93,26 @@ mod tests {
assert_eq!(parse_version(" 1.2.3 \n"), Some((1, 2, 3)));
assert_eq!(is_newer(" 1.2.3 ", "1.2.2"), Some(true));
}
#[test]
fn official_server_version_comparison() {
assert!(is_official_server_older("0.152.1", "0.152.0"));
assert!(is_official_server_older("0.153.0", "0.152.1"));
assert!(!is_official_server_older("0.152.0", "0.152.0"));
assert!(!is_official_server_older("0.152.0", "0.153.0"));
for version in [
"0.0.0",
"0.0.0.0",
"0.153.0-alpha.1",
"unknown",
"0.153",
"0.153.0.1",
" 0.153.0",
"+0.153.0",
"0.0153.0",
] {
assert!(!is_official_server_older(version, "0.152.0"));
assert!(!is_official_server_older("0.153.0", version));
}
}
}