From af57df4d8bc3d9e396f9fe5217cb52262fd7af27 Mon Sep 17 00:00:00 2001 From: webbrain-one <295484252+webbrain-one@users.noreply.github.com> Date: Fri, 21 Aug 2026 21:09:04 +0300 Subject: [PATCH] Display front-end error when PR summary interface call fails Fixes #13 --- gitlab_bot.py | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/gitlab_bot.py b/gitlab_bot.py index 1d28781..912c488 100644 --- a/gitlab_bot.py +++ b/gitlab_bot.py @@ -153,19 +153,28 @@ async def note_issue_event(event, gl, *args, **kwargs): @bot.router.register("Merge Request Hook", action="open") async def merge_request_opened_event(event, gl, *args, **kwargs): if not ignore_event(event): - await merge_request_hooks.merge_request_opened_event(event, gl, args, kwargs) + try: + await merge_request_hooks.merge_request_opened_event(event, gl, args, kwargs) + except Exception as exc: + await _post_merge_request_error_note(event, gl, exc) @bot.router.register("Merge Request Hook", action="update") async def merge_request_updated_event(event, gl, *args, **kwargs): if not ignore_event(event): - await merge_request_hooks.merge_request_updated_event(event, gl, args, kwargs) + try: + await merge_request_hooks.merge_request_updated_event(event, gl, args, kwargs) + except Exception as exc: + await _post_merge_request_error_note(event, gl, exc) @bot.router.register("Merge Request Hook", action="reopen") async def merge_request_reopen_event(event, gl, *args, **kwargs): if not ignore_event(event): - await merge_request_hooks.merge_request_reopen_event(event, gl, args, kwargs) + try: + await merge_request_hooks.merge_request_reopen_event(event, gl, args, kwargs) + except Exception as exc: + await _post_merge_request_error_note(event, gl, exc) @bot.router.register("Merge Request Hook", action="approved") @@ -218,6 +227,34 @@ def ignore_event(event) -> bool: return True +async def _post_merge_request_error_note(event, gl, exc): + data = getattr(event, "data", {}) or {} + project = data.get("project") or {} + project_id = project.get("id") if isinstance(project, dict) else None + attributes = data.get("object_attributes") or {} + mr_iid = attributes.get("iid") if isinstance(attributes, dict) else None + if mr_iid is None: + merge_request = data.get("merge_request") or {} + mr_iid = merge_request.get("iid") if isinstance(merge_request, dict) else None + if project_id is None or mr_iid is None: + logging.error( + "Unable to post merge request error note (project_id=%s, mr_iid=%s): %s", + project_id, + mr_iid, + exc, + ) + return + post = getattr(gl, "post", None) + if post is None: + logging.error("Unable to post merge request error note: GitLab API client unavailable: %s", exc) + return + body = f"PR summary interface call failed: {exc}" + try: + await post(f"/projects/{project_id}/merge_requests/{mr_iid}/notes", data={"body": body}) + except Exception: + logging.error("Unable to post merge request error note: %s", exc, exc_info=True) + + if __name__ == "__main__": logging.basicConfig(level=logging.INFO) bot.run(host=bot_host, port=int(bot_port))