fix: use semver comparison for version-update hint

Replaced naive  with parse_semver tuple comparison
so dev builds (e.g. "0.8.46-pre") don't trigger false update hints.
Falls back to string compare when either side is non-semver.

Caught by Gemini Code Assist review on PR #2181.
This commit is contained in:
Hunter Bown
2026-05-26 07:58:40 -05:00
parent e0c8e8d89a
commit 923911ae1d
+18 -1
View File
@@ -916,7 +916,14 @@ async fn run_event_loop(
let json: serde_json::Value = resp.json().await.ok()?;
let tag = json["tag_name"].as_str()?;
let latest = tag.trim_start_matches('v');
if latest != current {
// Compare semver so dev builds (e.g. "0.8.46-pre") don't
// trigger false hints. Falls back to string compare on
// unparseable versions.
let newer = match (parse_semver(latest), parse_semver(&current)) {
(Some(l), Some(c)) => l > c,
_ => latest != current,
};
if newer {
Some(format!(
"v{latest} available — run `codewhale update` and restart"
))
@@ -7984,5 +7991,15 @@ fn extract_reasoning_header(text: &str) -> Option<String> {
}
}
/// Parse a `major.minor.patch` version string into a comparable tuple.
/// Returns `None` on any parse failure (non-semver, dev suffixes, etc.).
fn parse_semver(v: &str) -> Option<(u32, u32, u32)> {
let mut parts = v.splitn(3, '.');
let major = parts.next()?.parse::<u32>().ok()?;
let minor = parts.next()?.parse::<u32>().ok()?;
let patch = parts.next().unwrap_or("0").parse::<u32>().ok()?;
Some((major, minor, patch))
}
#[cfg(test)]
mod tests;