Regeln für PR- und Issue-Texte an AG_QGIS angleichen (#3)

Beim Übernehmen aus AG_QGIS/Projektwissen (main @ a0bb40a) waren Regeln
verloren gegangen oder eingeengt worden:

- PR-Vorlage: Abschnitt „Änderungen an Syntax und Ablageformat“ (dort
  „Änderungen an Verträgen“), Checklistenpunkt „keine Debug-print“.
- Issue-Vorlage: Frage nach Syntax/Ablageformat, Testpflicht nicht nur
  für den Konverter.
- AGENTS.md: Testpflicht wieder für jede neue Funktionalität; Syntax und
  Ablageformat als Verträge; kein Arbeitsbranch ohne Issue; PR-Text
  vollständig mit Checkliste. Skill sn-aufgabe-bearbeiten und Checkliste
  in Leitfaden 03 entsprechend.
- ADR 0001 und STATUS: Quell-Commit war a0bb40a, nicht decd2a0.

gitea.py prüft vor jeder Abfrage, ob die Repos ohne Anmeldung lesbar
sind, und bricht sonst mit klarer Meldung ab – bisher meldete die
Sammelsuche bei einem privaten Repo „Keine passenden Tickets“. Die
Ausgabe läuft jetzt über UTF-8 (cp1252-Konsolen stürzten bei „→“ ab).

Tests: python -m pytest -q -> 61 bestanden (6 neu in tests/test_gitea.py).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-23 13:50:24 +02:00
co-authored by Claude Opus 5.5
parent 87cb9b76ac
commit fd58d75502
10 changed files with 165 additions and 14 deletions
+28
View File
@@ -32,6 +32,7 @@ from __future__ import annotations
import argparse
import json
import shutil
import sys
import tomllib
import urllib.error
import urllib.parse
@@ -186,6 +187,26 @@ def hole_issues(basis: str, org: str, repo: str, state: str, art: str = "issues"
) from None
def pruefe_sichtbar(basis: str, org: str, namen: list[str]) -> None:
"""Bricht mit klarer Meldung ab, wenn ein Repo ohne Anmeldung nicht lesbar ist.
Ohne diese Prüfung liefert die Sammelsuche über die Organisation für ein privates
Repo einfach keine Treffer – das sieht aus wie „keine offenen Tickets“.
"""
unsichtbar = []
for name in namen:
try:
hole_json(baue_url(basis, f"/repos/{urllib.parse.quote(org)}/{urllib.parse.quote(name)}"))
except NichtGefunden:
unsichtbar.append(name)
if unsichtbar:
raise NichtGefunden(
f"Ohne Anmeldung nicht lesbar: {', '.join(f'{org}/{n}' for n in unsichtbar)}. "
"Das Repo ist privat oder existiert nicht. scripts/gitea.py liest bewusst ohne Token; "
"das Repo muss in Gitea öffentlich sein (Repo → Einstellungen → Sichtbarkeit)."
)
def hole_issues_org(basis: str, org: str, state: str, art: str = "issues",
suchtext: str | None = None) -> list[dict]:
"""Issues ALLER Repos der Organisation über den Sammelendpunkt.
@@ -549,6 +570,11 @@ def befehl_entwurf(basis: str, org: str, repo: str, art: str, nummer: int | None
# ------------------------------------------------------------------ main ------
def main() -> int:
# Windows-Konsolen und Pipes laufen oft mit cp1252; Zeichen wie „→“ in Tickettexten
# oder Meldungen führten sonst zum Absturz der Ausgabe.
for strom in (sys.stdout, sys.stderr):
if hasattr(strom, "reconfigure"):
strom.reconfigure(encoding="utf-8", errors="replace")
breite_eltern = argparse.ArgumentParser(add_help=False)
breite_eltern.add_argument("--breite", type=int, help="Terminalbreite erzwingen (Standard: automatisch)")
@@ -596,6 +622,8 @@ def main() -> int:
return 2
repo = loese_repo(args.repo, namen) if getattr(args, "repo", None) else None
if not (args.befehl == "entwurf" and args.art == "issue"): # nur der Issue-Entwurf kommt ohne Netz aus
pruefe_sichtbar(basis, org, [repo] if repo else namen)
if args.befehl == "tickets":
return befehl_tickets(basis, org, repo, namen, args)