From f546b7d6606346401bf415781a09c15b409c86a9 Mon Sep 17 00:00:00 2001 From: Chaim Date: Mon, 30 Mar 2026 11:34:38 +0000 Subject: [PATCH] fix: handle duplicate ZIP assets in Gitea releases - When re-publishing, delete old ZIP assets before uploading new one - Take last ZIP asset when duplicates exist in deploy flow - Handle empty response body from DELETE API calls Co-Authored-By: Claude Opus 4.6 (1M context) --- server.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/server.py b/server.py index 23d2a05..54adddc 100644 --- a/server.py +++ b/server.py @@ -126,7 +126,10 @@ def gitea_api(method, path, data=None, raw=False): req = urllib.request.Request(url, data=data, headers=headers, method=method) try: resp = urllib.request.urlopen(req, context=SSL_CTX, timeout=60) - return json.loads(resp.read()) if not raw else resp.read() + body = resp.read() + if raw: + return body + return json.loads(body) if body else {} except urllib.error.HTTPError as e: body = e.read().decode() return {'error': True, 'code': e.code, 'message': body[:300]} @@ -244,7 +247,15 @@ def build_and_publish(module, version): }) release_id = release_result.get('id') asset_status = 'skipped' - if release_id and not release_result.get('error'): + # If release already exists, fetch its ID and delete old ZIP assets + if not release_id or release_result.get('error'): + existing = gitea_api('GET', f'/repos/{GITEA_ORG}/{module}/releases/tags/{tag}') + release_id = existing.get('id') + if release_id: + for old_asset in existing.get('assets', []): + if old_asset['name'].endswith('.zip'): + gitea_api('DELETE', f'/repos/{GITEA_ORG}/{module}/releases/{release_id}/assets/{old_asset["id"]}') + if release_id: # Upload asset using multipart boundary = '----FormBoundary7MA4YWxkTrZu0gW' body = ( @@ -264,7 +275,7 @@ def build_and_publish(module, version): asset_status = 'uploaded' except urllib.error.HTTPError as e: asset_status = f'error:{e.code}' - elif release_result.get('error'): + else: asset_status = f'release_failed:{release_result.get("message","")[:100]}' # 7. Update DB @@ -309,7 +320,7 @@ def deploy_to_customer(customer, module, version): for asset in releases.get('assets', []): if asset['name'].endswith('.zip'): zip_url = asset['browser_download_url'] - break + # Don't break - take the last ZIP (newest upload) in case of duplicates if not zip_url: return {'status': 'error', 'step': 'find_zip', 'message': 'No ZIP asset in release'}