fix: add shared API pagination and failure handling (#67) #83
Reference in New Issue
Block a user
Delete Branch "fix/issue-67-api-pagination-failures"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements #67. Narrow API-reliability improvement with unit coverage — no
mcp_server.pymodular refactor (#65).Reliability gap
gitea_auth.api_requesthad no request timeout, letURLError/timeouts/DNS failures propagate raw (uncaught), gave 502/503 no clarity, raised bareJSONDecodeErroron malformed success bodies, echoed raw upstream error bodies unredacted, and did no pagination (one page only —gitea_list_issueseven crashed on aNonebody).Changes
gitea_auth.pyapi_requesthardened: per-requesttimeout(envGITEA_HTTP_TIMEOUT, default 30s);(URLError, TimeoutError)→ clearRuntimeError("network error contacting Gitea: …"); 502/503/504 → explicit "Gitea upstream unavailable"; malformed success JSON →RuntimeError("malformed JSON response…"); all error text redacted via the audit redactor. Success path and 429 retry/backoff preserved.api_get_all(url, auth, *, limit=None, page_size=50, max_pages=100): page-based pagination that relies on page length (tolerates missing/malformedX-Total-Count/Linkmetadata), honors an optional overalllimit, and caps pages. Reusesapi_request(inherits failure handling).mcp_server.py— wiredapi_get_allinto read-only list toolsgitea_list_issues,gitea_list_prs,gitea_list_labels. Return shapes unchanged;list_issuesstill honorslimitas an overall max, now across pages. Internal?limit=100label-id lookups left unchanged (out of scope; noted follow-up).Tests
tests/test_api_reliability.py— 18 cases: single/multi-page, missing metadata, malformed (non-list) metadata, limit cap, max-pages cap, query preservation; timeout, DNS/network, 502/503, malformed error payload, malformed success JSON, no-secret leakage, auth-header-never-in-error, success + 429 preserved.test_mcp_server.pyto the new call path.Checks
py_compile mcp_server.py/manage_labels.py(+gitea_auth.py) — OKbash -n scripts/clear-provenance— OKgit diff --check— cleanpytest tests/ -q— 345 passed (327 → +18)Scope
No auth/profile/merge/review/tracker behavior changed. No Jenkins/GlitchTip/release/worktree changes. No #65 refactor.
🤖 Generated with Claude Code
Reviewed PR #83 at
cfe3ff6755. Scope is limited to shared Gitea API reliability/pagination handling and tests. Changed files match expected, pagination is wired only into list PRs/issues/labels, targeted and full test suites pass, and no auth/profile/merge/review/tracker behavior or Jenkins/GlitchTip work is included.