Skip to content

Commit 5233223

Browse files
committed
fix(cli_audit): filter pre-releases from Atom feed for all GitHub repos
- Extend pre-release filtering from Python-only to all GitHub repos - Filter out rc, alpha, beta suffixes (e.g., v29.0.0-rc.1, v3.15.0a1) - Accept only stable versions matching vX.Y or vX.Y.Z pattern - Pick highest stable version by semantic version comparison - Fixes Docker showing 29.0.0-rc.1 as upgrade target when 28.5.1 is latest stable The Atom feed is a fallback when GitHub API is rate-limited or /releases/latest doesn't exist. Pre-releases in the Atom feed would previously be treated as stable versions, causing incorrect upgrade prompts for alpha/beta/rc versions across all tools.
1 parent dbca888 commit 5233223

File tree

1 file changed

+23
-34
lines changed

1 file changed

+23
-34
lines changed

cli_audit.py

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,40 +2134,29 @@ def latest_github(owner: str, repo: str) -> tuple[str, str]:
21342134
pass
21352135
try:
21362136
atom = http_get(f"https://github.com/{owner}/{repo}/releases.atom").decode("utf-8", "ignore")
2137-
# For Python, filter out pre-release tags (alpha, beta, rc) from atom feed
2138-
if owner == "python" and repo == "cpython":
2139-
# Find all stable tags in atom feed and pick the highest version
2140-
best: tuple[tuple[int, ...], str, str] | None = None
2141-
for match in re.finditer(r"/releases/tag/([^<\"]+)", atom):
2142-
tag = normalize_version_tag(match.group(1).strip())
2143-
# Accept only stable final release tags like v3.14.0 or v3.12.7
2144-
# Exclude rc, alpha, beta, a, b suffixes
2145-
if tag and re.match(r"^v\d+\.\d+\.\d+$", tag):
2146-
ver = extract_version_number(tag)
2147-
if ver:
2148-
try:
2149-
nums = tuple(int(x) for x in ver.split("."))
2150-
tup = (nums, tag, ver)
2151-
if best is None or tup[0] > best[0]:
2152-
best = tup
2153-
except Exception:
2154-
continue
2155-
if best is not None:
2156-
_, tag, ver = best
2157-
result = (tag, ver)
2158-
set_manual_latest(repo, tag)
2159-
set_hint(f"gh:{owner}/{repo}", "atom_filtered")
2160-
return result
2161-
else:
2162-
# For other repos, take first tag from atom feed
2163-
m = re.search(r"/releases/tag/([^<\"]+)", atom)
2164-
if m:
2165-
tag = normalize_version_tag(m.group(1).strip())
2166-
if tag and tag.lower() not in ("releases", "latest"):
2167-
result = (tag, extract_version_number(tag))
2168-
set_manual_latest(repo, tag)
2169-
set_hint(f"gh:{owner}/{repo}", "atom")
2170-
return result
2137+
# Filter out pre-release tags (alpha, beta, rc) from atom feed for all repos
2138+
# Find all stable tags and pick the highest version
2139+
best: tuple[tuple[int, ...], str, str] | None = None
2140+
for match in re.finditer(r"/releases/tag/([^<\"]+)", atom):
2141+
tag = normalize_version_tag(match.group(1).strip())
2142+
# Accept only stable final release tags like v3.14.0, v28.5.1
2143+
# Exclude rc, alpha, beta, a, b suffixes (e.g., v29.0.0-rc.1, v3.15.0a1)
2144+
if tag and re.match(r"^v?\d+\.\d+(\.\d+)?$", tag):
2145+
ver = extract_version_number(tag)
2146+
if ver:
2147+
try:
2148+
nums = tuple(int(x) for x in ver.split("."))
2149+
tup = (nums, tag, ver)
2150+
if best is None or tup[0] > best[0]:
2151+
best = tup
2152+
except Exception:
2153+
continue
2154+
if best is not None:
2155+
_, tag, ver = best
2156+
result = (tag, ver)
2157+
set_manual_latest(repo, tag)
2158+
set_hint(f"gh:{owner}/{repo}", "atom_filtered")
2159+
return result
21712160
except Exception:
21722161
pass
21732162
return "", ""

0 commit comments

Comments
 (0)