fix(changelog): filter non-app releases

This commit is contained in:
t8y2 committed 2026-07-24 09:55:48 +08:00
1 parent 1870be4a81
commit 562edef4dc
6 files changed
+110 -6

No files matched your search

+46 -2
View File
@@ -54,6 +54,39 @@ pub fn normalize_changelog_lang(lang: &str) -> &'static str {
}
}
fn is_app_release_tag(tag: &str) -> bool {
let Some(version) = tag.strip_prefix('v') else {
return false;
};
let mut parts = version.splitn(3, '.');
let Some(major) = parts.next() else {
return false;
};
let Some(minor) = parts.next() else {
return false;
};
let Some(patch_and_suffix) = parts.next() else {
return false;
};
if major.is_empty()
|| minor.is_empty()
|| !major.bytes().all(|byte| byte.is_ascii_digit())
|| !minor.bytes().all(|byte| byte.is_ascii_digit())
{
return false;
}
let patch_len = patch_and_suffix.bytes().take_while(u8::is_ascii_digit).count();
if patch_len == 0 {
return false;
}
let suffix = &patch_and_suffix[patch_len..];
suffix.is_empty()
|| ((suffix.starts_with('.') || suffix.starts_with('-'))
&& suffix.len() > 1
&& suffix[1..].bytes().all(|byte| byte.is_ascii_alphanumeric() || byte == b'.' || byte == b'-'))
}
pub async fn fetch_changelog(lang: &str) -> Result<ChangelogData, String> {
let lang = normalize_changelog_lang(lang);
let client = build_changelog_http_client()?;
@@ -68,7 +101,8 @@ pub async fn fetch_changelog(lang: &str) -> Result<ChangelogData, String> {
.map_err(|e| format!("Failed to fetch changelog: {e}"))?;
let mut data: ChangelogData = resp.json().await.map_err(|e| format!("Failed to parse changelog: {e}"))?;
data.releases.retain(|release| !release.tag.trim().is_empty());
// Treat R2 as untrusted cached data so auxiliary release streams never leak into the app UI.
data.releases.retain(|release| is_app_release_tag(release.tag.trim()));
Ok(data)
}
@@ -86,7 +120,7 @@ fn build_changelog_http_client() -> Result<reqwest::Client, String> {
#[cfg(test)]
mod tests {
use super::normalize_changelog_lang;
use super::{is_app_release_tag, normalize_changelog_lang};
#[test]
fn normalizes_changelog_lang() {
@@ -96,4 +130,14 @@ mod tests {
assert_eq!(normalize_changelog_lang("en"), "en");
assert_eq!(normalize_changelog_lang("ja"), "en");
}
#[test]
fn recognizes_only_app_release_tags() {
assert!(is_app_release_tag("v0.5.66"));
assert!(is_app_release_tag("v1.2.3-hotfix.1"));
assert!(!is_app_release_tag("packages-v0.4.42"));
assert!(!is_app_release_tag("agents-v0.2.64"));
assert!(!is_app_release_tag("v0.5"));
assert!(!is_app_release_tag("v0.5.x"));
}
}