diff --git a/build.py b/build.py index 9535fd3..58bd80c 100644 --- a/build.py +++ b/build.py @@ -321,50 +321,67 @@ def _tag_version_key(tag_name: str): def cleanup_gitea_releases(): - """Keep the first release (v1.0.0) and the last 5 releases on Gitea, delete the rest.""" + """Keep the first release (v1.0.0) and the last 5 on Gitea, delete the rest + orphan tags.""" auth = _get_gitea_auth() if not auth: return - # List all releases + # --- Clean releases --- try: - req = urllib.request.Request( - f"{_GITEA_API}/releases?limit=50", - headers=auth, - ) + req = urllib.request.Request(f"{_GITEA_API}/releases?limit=50", headers=auth) resp = urllib.request.urlopen(req, timeout=30) releases = json.loads(resp.read()) except Exception as e: print(f"Gitea release list failed: {e}") return - if len(releases) <= 6: + keep_tags = set() + if len(releases) > 6: + releases.sort(key=lambda r: _tag_version_key(r.get("tag_name", ""))) + first = releases[0] + last_5 = releases[-5:] + keep_ids = {first["id"]} | {r["id"] for r in last_5} + keep_tags = {first.get("tag_name")} | {r.get("tag_name") for r in last_5} + + removed = [] + for r in releases: + if r["id"] in keep_ids: + continue + try: + req = urllib.request.Request( + f"{_GITEA_API}/releases/{r['id']}", headers=auth, method="DELETE") + urllib.request.urlopen(req, timeout=15) + removed.append(r.get("tag_name", "?")) + except Exception as e: + print(f"Failed to delete Gitea release {r.get('tag_name')}: {e}") + if removed: + print(f"Cleaned {len(removed)} old Gitea releases: {', '.join(removed)}") + else: + keep_tags = {r.get("tag_name") for r in releases} + + # --- Clean orphan tags (tags without releases) --- + try: + req = urllib.request.Request(f"{_GITEA_API}/tags?limit=50", headers=auth) + resp = urllib.request.urlopen(req, timeout=30) + tags = json.loads(resp.read()) + except Exception: return - # Sort by semver - releases.sort(key=lambda r: _tag_version_key(r.get("tag_name", ""))) - - first = releases[0] - last_5 = releases[-5:] - keep_ids = {first["id"]} | {r["id"] for r in last_5} - - removed = [] - for r in releases: - if r["id"] in keep_ids: + removed_tags = [] + for tag in tags: + name = tag.get("name", "") + if name in keep_tags: continue try: req = urllib.request.Request( - f"{_GITEA_API}/releases/{r['id']}", - headers=auth, - method="DELETE", - ) - urllib.request.urlopen(req, timeout=15) - removed.append(r.get("tag_name", "?")) - except Exception as e: - print(f"Failed to delete Gitea release {r.get('tag_name')}: {e}") + f"{_GITEA_API}/tags/{name}", headers=auth, method="DELETE") + urllib.request.urlopen(req, timeout=10) + removed_tags.append(name) + except Exception: + pass - if removed: - print(f"Cleaned {len(removed)} old Gitea releases: {', '.join(removed)}") + if removed_tags: + print(f"Cleaned {len(removed_tags)} orphan Gitea tags: {', '.join(removed_tags)}") def cleanup_old_releases(): diff --git a/releases/ServerManager-v1.9.12-win-x64.exe b/releases/ServerManager-v1.9.12-win-x64.exe new file mode 100644 index 0000000..f1dde2a Binary files /dev/null and b/releases/ServerManager-v1.9.12-win-x64.exe differ diff --git a/version.py b/version.py index 19ae372..c8b3d1a 100755 --- a/version.py +++ b/version.py @@ -1,6 +1,6 @@ """Version info for ServerManager.""" -__version__ = "1.9.11" +__version__ = "1.9.12" __app_name__ = "ServerManager" __author__ = "aibot777" __description__ = "Desktop GUI for managing remote servers"