From b13aa10f692c88ed2af99ef21b1b1efe227d2ca9 Mon Sep 17 00:00:00 2001 From: s-FunIA Date: Mon, 19 Jan 2026 10:28:59 +0100 Subject: [PATCH] ci: label Type/State/Category (fix indent + debug PARSED) --- .gitea/workflows/auto-label-issues.yml | 83 ++++++++++++++------------ 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/.gitea/workflows/auto-label-issues.yml b/.gitea/workflows/auto-label-issues.yml index 57fee94..dd04a09 100644 --- a/.gitea/workflows/auto-label-issues.yml +++ b/.gitea/workflows/auto-label-issues.yml @@ -8,7 +8,7 @@ jobs: label: runs-on: ubuntu-latest steps: - - name: Apply labels from Type/State + - name: Apply labels from Type/State/Category env: FORGE_BASE: ${{ vars.FORGE_API || vars.FORGE_BASE }} FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }} @@ -24,64 +24,71 @@ jobs: event_path = os.environ["EVENT_PATH"] with open(event_path, "r", encoding="utf-8") as f: - ev = json.load(f) + ev = json.load(f) issue = ev.get("issue") or {} title = issue.get("title") or "" body = issue.get("body") or "" number = issue.get("number") or issue.get("index") if not number: - raise SystemExit("No issue number/index in event payload") + raise SystemExit("No issue number/index in event payload") - def pick_line(key): - m = re.search(rf"^{re.escape(key)}:\s*([^\n\r]+)", body, flags=re.M) - return m.group(1).strip() if m else "" + def pick_line(key: str) -> str: + m = re.search(rf"^\s*{re.escape(key)}\s*:\s*([^\n\r]+)", body, flags=re.M) + return m.group(1).strip() if m else "" desired = set() t = pick_line("Type") s = pick_line("State") + c = pick_line("Category") - # 1) Type / State explicit (depuis le site) - if t: desired.add(t) - if s: desired.add(s) + print("PARSED:", {"Type": t, "State": s, "Category": c}) - # 2) Fallback depuis le titre si besoin + # 1) explicite depuis le body + if t: + desired.add(t) + if s: + desired.add(s) + if c: + desired.add(c) + + # 2) fallback depuis le titre si Type absent if not t: - if title.startswith("[Correction]"): - desired.add("type/correction") - elif title.startswith("[Fact-check]") or title.startswith("[Vérification]"): - desired.add("type/fact-check") + if title.startswith("[Correction]"): + desired.add("type/correction") + elif title.startswith("[Fact-check]") or title.startswith("[Vérification]"): + desired.add("type/fact-check") + # 3) fallback State si absent if not s: - # état par défaut si absent - if "type/fact-check" in desired: - desired.add("state/a-sourcer") - elif "type/correction" in desired: - desired.add("state/recevable") + if "type/fact-check" in desired: + desired.add("state/a-sourcer") + elif "type/correction" in desired: + desired.add("state/recevable") if not desired: - print("No labels to apply.") - raise SystemExit(0) + print("No labels to apply.") + raise SystemExit(0) api = forge + "/api/v1" headers = { - "Authorization": f"token {token}", - "Accept": "application/json", - "Content-Type": "application/json", - "User-Agent": "archicratie-auto-label/1.0", + "Authorization": f"token {token}", + "Accept": "application/json", + "Content-Type": "application/json", + "User-Agent": "archicratie-auto-label/1.0", } def jreq(method, url, payload=None): - data = None if payload is None else json.dumps(payload).encode("utf-8") - req = urllib.request.Request(url, data=data, headers=headers, method=method) - try: - with urllib.request.urlopen(req) as r: - b = r.read() - return json.loads(b.decode("utf-8")) if b else None - except urllib.error.HTTPError as e: - b = e.read().decode("utf-8", errors="replace") - raise RuntimeError(f"HTTP {e.code} {method} {url}\n{b}") from e + data = None if payload is None else json.dumps(payload).encode("utf-8") + req = urllib.request.Request(url, data=data, headers=headers, method=method) + try: + with urllib.request.urlopen(req, timeout=20) as r: + b = r.read() + return json.loads(b.decode("utf-8")) if b else None + except urllib.error.HTTPError as e: + b = e.read().decode("utf-8", errors="replace") + raise RuntimeError(f"HTTP {e.code} {method} {url}\n{b}") from e # labels repo labels = jreq("GET", f"{api}/repos/{owner}/{repo}/labels?limit=1000") or [] @@ -89,7 +96,7 @@ jobs: missing = [x for x in desired if x not in name_to_id] if missing: - raise SystemExit("Missing labels in repo: " + ", ".join(sorted(missing))) + raise SystemExit("Missing labels in repo: " + ", ".join(sorted(missing))) wanted_ids = [name_to_id[x] for x in desired] @@ -102,9 +109,9 @@ jobs: # set labels = union (n'enlève rien) url = f"{api}/repos/{owner}/{repo}/issues/{number}/labels" try: - jreq("PUT", url, {"labels": final_ids}) + jreq("PUT", url, {"labels": final_ids}) except Exception: - jreq("PUT", url, final_ids) + jreq("PUT", url, final_ids) print(f"OK labels #{number}: {sorted(desired)}") - PY + PY \ No newline at end of file