Überspringe Repos ohne Issue-Einheit und lass ein Repo nicht alle stoppen

www.ent-spannung.de auf git.home hat Issues abgeschaltet; jeder
Issue-Endpunkt antwortet dort mit 404 und riss den ganzen Lauf. Jetzt
filtert die Repo-Liste nach has_issues, ein 404 auf die Kommentare gilt
als leer, und ein Fehler je Repo landet im Ergebnis statt im Abbruch.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 18:54:25 +02:00
co-authored by Claude Fable 5.1
parent 0a13de7ab1
commit 4d9a8399a6
2 changed files with 24 additions and 4 deletions
+13 -2
View File
@@ -105,7 +105,12 @@ class Forge:
page += 1
def org_repos(self, org: str) -> list[str]:
return [f"{org}/{r['name']}" for r in self.paged(f"/orgs/{org}/repos")]
"""Repos einer Organisation, die Vorgaenge haben koennen. Ein Repo mit
abgeschalteter Issue-Einheit (www.ent-spannung.de auf git.home)
antwortet auf jeden Issue-Endpunkt mit 404 -- das ist keine Stoerung,
also gar nicht erst anfragen."""
return [f"{org}/{r['name']}" for r in self.paged(f"/orgs/{org}/repos")
if r.get("has_issues", True)]
def issues(self, repo: str, kind: str, since: str | None) -> Iterator[dict]:
params = {"state": "all", "type": kind, "sort": "recentupdate"}
@@ -131,7 +136,13 @@ class Forge:
aelteste zuerst, also bleibt die Reihenfolge je Vorgang erhalten.
"""
by_issue: dict[int, list[dict]] = {}
for c in self.paged(f"/repos/{repo}/issues/comments"):
try:
comments = list(self.paged(f"/repos/{repo}/issues/comments"))
except requests.HTTPError as e:
if e.response is not None and e.response.status_code == 404:
return by_issue # keine Issue-Einheit -> keine Kommentare
raise
for c in comments:
url = c.get("issue_url") or ""
m = re.search(r"/(?:issues|pulls)/(\d+)$", url)
if not m:
+11 -2
View File
@@ -60,12 +60,21 @@ class Runner:
repos += forge.org_repos(org)
state = load_state(c.state)
seen = written = 0
fehler: dict[str, str] = {}
for repo in dict.fromkeys(repos):
s, w = ingest_repo(forge, repo, c.ablage, state, full)
try:
s, w = ingest_repo(forge, repo, c.ablage, state, full)
except Exception as e: # noqa: BLE001 -- ein kaputtes Repo stoppt nicht die anderen
fehler[repo] = str(e)[:200]
print(f"km: ingest {repo}: {fehler[repo]}", file=sys.stderr, flush=True)
continue
seen += s
written += w
save_state(c.state, state)
return {"repos": len(repos), "gesehen": seen, "geschrieben": written}
out = {"repos": len(repos), "gesehen": seen, "geschrieben": written}
if fehler:
out["fehler"] = fehler
return out
def _index(self) -> dict:
c = self.cfg