***v36 #36
@ -73,43 +73,7 @@ steps:
|
|||||||
drep review "${CI_REPO}" "${CI_COMMIT_PULL_REQUEST}"
|
drep review "${CI_REPO}" "${CI_COMMIT_PULL_REQUEST}"
|
||||||
|
|
||||||
echo "★ Adding ai-reviewed label to PR #${CI_COMMIT_PULL_REQUEST}"
|
echo "★ Adding ai-reviewed label to PR #${CI_COMMIT_PULL_REQUEST}"
|
||||||
sed 's/^ //' <<'PY' | python3
|
python3 ci/add-ai-reviewed-label.py
|
||||||
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
|
|
||||||
when:
|
when:
|
||||||
event:
|
event:
|
||||||
- pull_request
|
- pull_request
|
||||||
|
|||||||
82
ci/add-ai-reviewed-label.py
Normal file
82
ci/add-ai-reviewed-label.py
Normal file
@ -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()
|
||||||
Loading…
x
Reference in New Issue
Block a user