Skip to content
Merged
Show file tree
Hide file tree
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
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,3 +157,5 @@
).lower()
== "true"
)

bot_gitlab_merge_request_reviewer_username = os.getenv("BOT_GITLAB_MERGE_REQUEST_REVIEWER_USERNAME", None)
33 changes: 33 additions & 0 deletions src/merge_request_hook.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"]
Expand Down Expand Up @@ -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)

Expand Down