test/ci/add-ai-reviewed-label.py
2026-07-09 12:16:53 -07:00

83 lines
2.6 KiB
Python

#!/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()