Ü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:
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user