This commit is contained in:
2026-01-20 07:16:48 +00:00
parent 1445fff739
commit fa48841645

View File

@@ -808,13 +808,21 @@ class BCSCore:
_LOGGER.debug("BCS ensure_repo_details failed for %s", repo_id, exc_info=True) _LOGGER.debug("BCS ensure_repo_details failed for %s", repo_id, exc_info=True)
return r return r
async def list_repo_versions(self, repo_id: str, *, limit: int = 20) -> list[dict[str, Any]]: async def list_repo_versions(
self,
repo_id: str,
*,
limit: int = 20,
force_refresh: bool = False,
) -> list[dict[str, Any]]:
repo = self.get_repo(repo_id) repo = self.get_repo(repo_id)
if not repo: if not repo:
return [] return []
# Prefer cached version lists to avoid hammering provider APIs (notably GitHub unauthenticated # Prefer cached version lists to avoid hammering provider APIs (notably GitHub unauthenticated
# rate limits). We refresh on-demand when the user opens the selector. # rate limits). However, if the cached list is clearly a degraded fallback (e.g. only
# "Latest" + "Branch"), we treat it as stale and retry immediately when the user requests
# versions again.
cached = None cached = None
cached_ts = 0 cached_ts = 0
async with self._repo_cache_lock: async with self._repo_cache_lock:
@@ -823,8 +831,17 @@ class BCSCore:
cached_ts = int(cached.get("versions_ts", 0) or 0) cached_ts = int(cached.get("versions_ts", 0) or 0)
now = int(time.time()) now = int(time.time())
if isinstance(cached, dict) and cached.get("versions") and (now - cached_ts) < VERSIONS_CACHE_TTL_SECONDS: cached_versions = list(cached.get("versions") or []) if isinstance(cached, dict) else []
return list(cached.get("versions") or []) cache_fresh = (now - cached_ts) < VERSIONS_CACHE_TTL_SECONDS
# Cache hit if it's fresh and not degraded, unless the caller explicitly wants a refresh.
if (
not force_refresh
and cached_versions
and cache_fresh
and len(cached_versions) > 2
):
return cached_versions
try: try:
versions = await fetch_repo_versions( versions = await fetch_repo_versions(