diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 12aeee8..bd4c7af 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -27,9 +27,10 @@ jobs: python3 package_dist.py - name: Publish Release - uses: https://gitea.com/actions/gitea-release-action@v1 - with: - files: | - dist/* - api_key: ${{ secrets.TAG_TOKEN || github.token }} - token: ${{ secrets.TAG_TOKEN || github.token }} + env: + GITEA_TOKEN: ${{ secrets.TAG_TOKEN || github.token }} + GITEA_SERVER_URL: ${{ github.server_url }} + GITEA_REPOSITORY: ${{ github.repository }} + GITEA_REF_NAME: ${{ github.ref_name }} + run: | + python3 upload_release.py --skip-build diff --git a/upload_release.py b/upload_release.py index 655be63..bc796ed 100644 --- a/upload_release.py +++ b/upload_release.py @@ -7,13 +7,38 @@ import urllib.parse import mimetypes import package_dist -DEFAULT_GITEA_URL = "https://gitea.eibl.tech" -DEFAULT_REPO = "me0nline/LOGAR" +DEFAULT_GITEA_URL = os.environ.get("GITEA_SERVER_URL", "https://gitea.eibl.tech") +DEFAULT_REPO = os.environ.get("GITEA_REPOSITORY", "me0nline/LOGAR") + +def get_existing_assets(base_url, repo, release_id, token): + url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets" + req = urllib.request.Request(url, headers={"Authorization": f"token {token}", "Accept": "application/json"}) + try: + with urllib.request.urlopen(req) as resp: + return json.loads(resp.read().decode("utf-8")) + except Exception: + return [] + +def delete_asset(base_url, repo, release_id, asset_id, token): + url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets/{asset_id}" + req = urllib.request.Request(url, method="DELETE", headers={"Authorization": f"token {token}"}) + try: + with urllib.request.urlopen(req) as resp: + pass + except Exception: + pass def upload_file_to_release(base_url, repo, release_id, token, file_path): filename = os.path.basename(file_path) - url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets?name={urllib.parse.quote(filename)}" + # Clean up existing asset with same name if already present + existing_assets = get_existing_assets(base_url, repo, release_id, token) + for asset in existing_assets: + if asset.get("name") == filename: + print(f"[*] Removing existing asset '{filename}' (ID: {asset['id']})...") + delete_asset(base_url, repo, release_id, asset["id"], token) + + url = f"{base_url}/api/v1/repos/{repo}/releases/{release_id}/assets?name={urllib.parse.quote(filename)}" with open(file_path, "rb") as f: file_bytes = f.read() @@ -67,18 +92,23 @@ def create_or_get_release(base_url, repo, tag, token, title=None, notes=None): def main(): parser = argparse.ArgumentParser(description="Upload LOGAR compiled binaries directly to Gitea Release") - parser.add_argument("--tag", required=True, help="Release tag name (e.g. v1.0.0)") + parser.add_argument("--tag", default=os.environ.get("GITEA_REF_NAME"), help="Release tag name (e.g. v1.0.0)") parser.add_argument("--token", default=os.environ.get("GITEA_TOKEN"), help="Gitea Personal Access Token (or set GITEA_TOKEN env var)") parser.add_argument("--url", default=DEFAULT_GITEA_URL, help="Base Gitea instance URL") parser.add_argument("--repo", default=DEFAULT_REPO, help="Repository owner/name") parser.add_argument("--skip-build", action="store_true", help="Skip running package_dist.py before upload") args = parser.parse_args() + tag = args.tag + if not tag: + tag = input("Enter tag name (e.g. v1.0.0): ").strip() + token = args.token if not token: - token = input("Enter Gitea Personal Access Token: ").strip() - if not token: - print("[!] Token is required.") + token = input("Enter Gitea Token: ").strip() + + if not tag or not token: + print("[!] Tag and Token are required.") sys.exit(1) if not args.skip_build: @@ -91,7 +121,7 @@ def main(): sys.exit(1) print(f"[*] Connecting to Gitea: {args.url} (repo: {args.repo})...") - release_id = create_or_get_release(args.url, args.repo, args.tag, token) + release_id = create_or_get_release(args.url, args.repo, tag, token) print(f"[*] Uploading binary assets from '{dist_dir}'...") for f in sorted(os.listdir(dist_dir)): @@ -99,7 +129,7 @@ def main(): if os.path.isfile(fpath): upload_file_to_release(args.url, args.repo, release_id, token, fpath) - print(f"\n[+] Release successfully published with binary assets: {args.url}/{args.repo}/releases/tag/{args.tag}") + print(f"\n[+] Release successfully published with binary assets: {args.url}/{args.repo}/releases/tag/{tag}") if __name__ == "__main__": main()