From 2ca8715cb7805deb4039de26514f926b8fe77a4e Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Sun, 13 Sep 2026 12:34:09 +0200 Subject: [PATCH] =?UTF-8?q?Feat:=20=C3=9Cberspringt=20Release/Publish=20be?= =?UTF-8?q?i=20bereits=20ver=C3=B6ffentlichter=20Version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prüft vor Build & Tests per Gitea Package-API, ob die aktuelle Crate-Version schon in der Registry existiert, und bricht den Release/Publish-Job dann gar nicht erst an, statt an einem Registry-Fehler zu scheitern. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01K2DxAVavuu4vMb2MC2G15g --- .gitea/workflows/main.yaml | 13 ++++++- scripts/check-version-published.py | 62 ++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 scripts/check-version-published.py diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml index 8923552..8157f26 100644 --- a/.gitea/workflows/main.yaml +++ b/.gitea/workflows/main.yaml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest outputs: code_changed: ${{ steps.filter.outputs.code }} + version_exists: ${{ steps.check-version.outputs.exists }} steps: - name: Checkout Repository uses: actions/checkout@v7 @@ -28,10 +29,20 @@ jobs: - '.cargo/**' - '.gitea/workflows/main.yaml' + - name: Prüfe ob Version bereits in der Registry existiert + id: check-version + if: steps.filter.outputs.code == 'true' + env: + GITEA_URL: ${{ gitea.server_url || github.server_url }} + REPO_OWNER: ${{ gitea.repository_owner || github.repository_owner }} + TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }} + run: | + python3 scripts/check-version-published.py + release-and-publish: name: Build, Publish Crate to Gitea Registry & Create Release needs: detect-changes - if: needs.detect-changes.outputs.code_changed == 'true' + if: needs.detect-changes.outputs.code_changed == 'true' && needs.detect-changes.outputs.version_exists != 'true' runs-on: ubuntu-latest steps: - name: Checkout Repository diff --git a/scripts/check-version-published.py b/scripts/check-version-published.py new file mode 100644 index 0000000..8de68b7 --- /dev/null +++ b/scripts/check-version-published.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""Prüft, ob die aktuelle Crate-Version bereits in der Gitea Cargo-Registry existiert. + +Liest Name und Version aus Cargo.toml und fragt die Gitea Package-API ab. +Das Ergebnis wird als Step-Output "exists" (true/false) in GITHUB_OUTPUT +geschrieben, damit der Release/Publish-Job komplett übersprungen werden kann, +statt erst nach Build & Tests an einem "Version existiert bereits"-Fehler der +Registry zu scheitern. +""" + +import os +import re +import urllib.error +import urllib.request + + +def read_cargo_field(field, path="Cargo.toml"): + pattern = re.compile(rf'^{field}\s*=\s*"(.*)"') + with open(path) as f: + for line in f: + match = pattern.match(line.strip()) + if match: + return match.group(1) + raise SystemExit(f"Feld '{field}' nicht in {path} gefunden.") + + +def version_exists(gitea_url, owner, name, version, token): + url = f"{gitea_url}/api/v1/packages/{owner}/cargo/{name}/{version}" + req = urllib.request.Request(url, method="GET") + req.add_header("Authorization", f"token {token}") + try: + with urllib.request.urlopen(req, timeout=10) as resp: + return resp.status == 200 + except urllib.error.HTTPError as e: + if e.code == 404: + return False + raise + + +def main(): + gitea_url = os.environ["GITEA_URL"].strip().rstrip("/") + owner = os.environ["REPO_OWNER"].strip() + token = os.environ["TOKEN"].strip() + github_output = os.environ["GITHUB_OUTPUT"] + + name = read_cargo_field("name") + version = read_cargo_field("version") + + print(f"Prüfe {name}@{version} in der Gitea Cargo Registry...") + exists = version_exists(gitea_url, owner, name, version, token) + + if exists: + print(f"Version {version} existiert bereits in der Registry. Release/Publish wird übersprungen.") + else: + print(f"Version {version} ist neu.") + + with open(github_output, "a") as f: + f.write(f"exists={'true' if exists else 'false'}\n") + + +if __name__ == "__main__": + main()