From 873d2b9a95c54b4c2f6868b9500915d57d64cea4 Mon Sep 17 00:00:00 2001 From: Franco Valerio Date: Sat, 17 May 2025 02:39:19 -0400 Subject: [PATCH] feat: check reviewer username for merge requests Adds a new optional configuration parameter to specify a required reviewer username for merge requests. If set, the bot validates that the specified reviewer in the `BOT_GITLAB_MERGE_REQUEST_REVIEWER_USERNAME` environment variable is present in the event data `reviewers` array before processing the merge request. --- README.md | 4 ++++ src/config.py | 2 ++ src/merge_request_hook.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/README.md b/README.md index 0f4537c..c332218 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,10 @@ In GitLab, it is necessary to set a milestone when creating a merge request. By Merge requests can only be merged if the source branch is associated with an existing issue. By default, this requirement is disabled. +**`BOT_GITLAB_MERGE_REQUEST_REVIEWER_USERNAME`** + +This parameter specifies the username of a required reviewer for merge requests. If set, merge requests will only be processed by the bot if a reviewer with this username is assigned. If not set, this check is skipped. + **`OPENAI_API_BASE` / `OPENAI_API_KEY` / `OPENAI_API_MODEL`** These parameters are used to connect the OPENAI model. diff --git a/src/config.py b/src/config.py index 41a467b..ba83db0 100644 --- a/src/config.py +++ b/src/config.py @@ -157,3 +157,5 @@ ).lower() == "true" ) + +bot_gitlab_merge_request_reviewer_username = os.getenv("BOT_GITLAB_MERGE_REQUEST_REVIEWER_USERNAME", None) diff --git a/src/merge_request_hook.py b/src/merge_request_hook.py index 3468df1..2d92f82 100644 --- a/src/merge_request_hook.py +++ b/src/merge_request_hook.py @@ -29,6 +29,7 @@ bot_gitlab_merge_request_milestone_required, bot_gitlab_merge_request_summary_enabled, bot_gitlab_username, + bot_gitlab_merge_request_reviewer_username, ) from src.i18n import _ from src.llm import AI, ai_diffs_summary @@ -103,6 +104,29 @@ def check_email(commit_author_name, commit_author_email): ) +def has_required_reviewer(event_data): + """Checks if the configured required reviewer is present in the merge request reviewers list.""" + required_username = bot_gitlab_merge_request_reviewer_username + if not required_username: + # If no required username is configured, the check passes + return True + + reviewers = [] + event_type = event_data.get("event_type") + + if event_type == "merge_request": + reviewers = event_data.get("reviewers", []) + + if not reviewers: + return False + + for reviewer in reviewers: + if reviewer.get("username") == required_username: + return True + + return False + + async def generate_diff_description_summary(event, gl): project_id = event.project_id description = event.data["object_attributes"]["description"] @@ -297,15 +321,24 @@ def has_ai_review_label(labels): class MergeRequestHooks: async def merge_request_opened_event(self, event, gl, *args, **kwargs): + if not has_required_reviewer(event.data): + logging.debug("Required reviewer not found. Skipping merge_request_opened_event.") + return await generate_diff_description_summary(event, gl) await check_commit(event, gl) async def merge_request_updated_event(self, event, gl, *args, **kwargs): + if not has_required_reviewer(event.data): + logging.debug("Required reviewer not found. Skipping merge_request_updated_event.") + return if is_opened_merge_request(event): await generate_diff_description_summary(event, gl) await check_commit(event, gl) async def merge_request_reopen_event(self, event, gl, *args, **kwargs): + if not has_required_reviewer(event.data): + logging.debug("Required reviewer not found. Skipping merge_request_reopen_event.") + return await generate_diff_description_summary(event, gl) await check_commit(event, gl)