From 80499584bd25c4200e954a3fda35a15d5424188e Mon Sep 17 00:00:00 2001 From: mitch Date: Thu, 9 Jul 2026 12:16:53 -0700 Subject: [PATCH] V35 --- .woodpecker.yml | 38 +---------------- ci/add-ai-reviewed-label.py | 82 +++++++++++++++++++++++++++++++++++++ index.php | 2 +- 3 files changed, 84 insertions(+), 38 deletions(-) create mode 100644 ci/add-ai-reviewed-label.py diff --git a/.woodpecker.yml b/.woodpecker.yml index d4e3d8c..0bcaaa4 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -73,43 +73,7 @@ steps: drep review "${CI_REPO}" "${CI_COMMIT_PULL_REQUEST}" echo "★ Adding ai-reviewed label to PR #${CI_COMMIT_PULL_REQUEST}" - sed 's/^ //' <<'PY' | python3 - import json - import os - import urllib.request - - token = os.environ['GITEA_TOKEN'] - owner = os.environ['CI_REPO_OWNER'] - repo = os.environ['CI_REPO_NAME'] - pr = os.environ['CI_COMMIT_PULL_REQUEST'] - label_name = 'ai-reviewed' - base = f'https://gitea.git.mitchecp.com/api/v1/repos/{owner}/{repo}' - - def api(method, path, data=None): - headers = {'Authorization': f'token {token}'} - body = None - if data is not None: - headers['Content-Type'] = 'application/json' - body = json.dumps(data).encode() - req = urllib.request.Request(f'{base}{path}', data=body, headers=headers, method=method) - with urllib.request.urlopen(req) as resp: - return json.load(resp) - - issue = api('GET', f'/issues/{pr}') - if any(label.get('name') == label_name for label in issue.get('labels', [])): - print(f'Label {label_name!r} already present on PR #{pr}') - else: - labels = api('GET', '/labels') - label_id = next((label['id'] for label in labels if label.get('name') == label_name), None) - if label_id is None: - label_id = api('POST', '/labels', { - 'name': label_name, - 'color': '0e8a16', - 'description': 'Drep AI review completed by Woodpecker', - })['id'] - api('POST', f'/issues/{pr}/labels', {'labels': [label_id]}) - print(f'Added label {label_name!r} to PR #{pr}') - PY + python3 ci/add-ai-reviewed-label.py when: event: - pull_request diff --git a/ci/add-ai-reviewed-label.py b/ci/add-ai-reviewed-label.py new file mode 100644 index 0000000..41de8be --- /dev/null +++ b/ci/add-ai-reviewed-label.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +"""Add ai-reviewed label to a Gitea PR after successful Drep review.""" + +from __future__ import annotations + +import json +import os +import sys +import urllib.error +import urllib.request + +GITEA_URL = "https://gitea.git.mitchecp.com" +LABEL_NAME = "ai-reviewed" +REQUEST_TIMEOUT = 30 + + +def require_env(name: str) -> str: + value = os.environ.get(name, "").strip() + if not value: + print(f"ERROR: required environment variable {name!r} is not set", file=sys.stderr) + sys.exit(1) + return value + + +def api_request(token: str, method: str, url: str, data: dict | None = None) -> dict | list: + headers = {"Authorization": f"token {token}"} + body = None + if data is not None: + headers["Content-Type"] = "application/json" + body = json.dumps(data).encode() + + req = urllib.request.Request(url, data=body, headers=headers, method=method) + try: + with urllib.request.urlopen(req, timeout=REQUEST_TIMEOUT) as resp: + raw = resp.read().decode() + return json.loads(raw) if raw else {} + except urllib.error.HTTPError as exc: + detail = exc.read().decode(errors="replace") + print(f"ERROR: Gitea API {method} {url} failed ({exc.code}): {detail}", file=sys.stderr) + sys.exit(1) + except urllib.error.URLError as exc: + print(f"ERROR: Gitea API {method} {url} failed: {exc.reason}", file=sys.stderr) + sys.exit(1) + + +def main() -> None: + token = require_env("GITEA_TOKEN") + owner = require_env("CI_REPO_OWNER") + repo = require_env("CI_REPO_NAME") + pr = require_env("CI_COMMIT_PULL_REQUEST") + base = f"{GITEA_URL}/api/v1/repos/{owner}/{repo}" + + issue = api_request(token, "GET", f"{base}/issues/{pr}") + labels_on_pr = issue.get("labels", []) + if any(label.get("name") == LABEL_NAME for label in labels_on_pr): + print(f"Label {LABEL_NAME!r} already present on PR #{pr}") + return + + repo_labels = api_request(token, "GET", f"{base}/labels") + label_id = next( + (label["id"] for label in repo_labels if label.get("name") == LABEL_NAME), + None, + ) + if label_id is None: + created = api_request( + token, + "POST", + f"{base}/labels", + { + "name": LABEL_NAME, + "color": "0e8a16", + "description": "Drep AI review completed by Woodpecker", + }, + ) + label_id = created["id"] + + api_request(token, "POST", f"{base}/issues/{pr}/labels", {"labels": [label_id]}) + print(f"Added label {LABEL_NAME!r} to PR #{pr}") + + +if __name__ == "__main__": + main() diff --git a/index.php b/index.php index ace2903..e181301 100644 --- a/index.php +++ b/index.php @@ -1,2 +1,2 @@