Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 40 additions & 3 deletions gitlab_bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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))