diff --git a/image/km/ingest_gitea.py b/image/km/ingest_gitea.py index 6aebae6..be29f06 100755 --- a/image/km/ingest_gitea.py +++ b/image/km/ingest_gitea.py @@ -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: diff --git a/image/km/runner.py b/image/km/runner.py index 8247b6a..c33e73f 100644 --- a/image/km/runner.py +++ b/image/km/runner.py @@ -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