Ü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
|
page += 1
|
||||||
|
|
||||||
def org_repos(self, org: str) -> list[str]:
|
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]:
|
def issues(self, repo: str, kind: str, since: str | None) -> Iterator[dict]:
|
||||||
params = {"state": "all", "type": kind, "sort": "recentupdate"}
|
params = {"state": "all", "type": kind, "sort": "recentupdate"}
|
||||||
@@ -131,7 +136,13 @@ class Forge:
|
|||||||
aelteste zuerst, also bleibt die Reihenfolge je Vorgang erhalten.
|
aelteste zuerst, also bleibt die Reihenfolge je Vorgang erhalten.
|
||||||
"""
|
"""
|
||||||
by_issue: dict[int, list[dict]] = {}
|
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 ""
|
url = c.get("issue_url") or ""
|
||||||
m = re.search(r"/(?:issues|pulls)/(\d+)$", url)
|
m = re.search(r"/(?:issues|pulls)/(\d+)$", url)
|
||||||
if not m:
|
if not m:
|
||||||
|
|||||||
+11
-2
@@ -60,12 +60,21 @@ class Runner:
|
|||||||
repos += forge.org_repos(org)
|
repos += forge.org_repos(org)
|
||||||
state = load_state(c.state)
|
state = load_state(c.state)
|
||||||
seen = written = 0
|
seen = written = 0
|
||||||
|
fehler: dict[str, str] = {}
|
||||||
for repo in dict.fromkeys(repos):
|
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
|
seen += s
|
||||||
written += w
|
written += w
|
||||||
save_state(c.state, state)
|
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:
|
def _index(self) -> dict:
|
||||||
c = self.cfg
|
c = self.cfg
|
||||||
|
|||||||
Reference in New Issue
Block a user