Skip to content

Commit 929cc71

Browse files
authored
fix: duplicate mr count in fallback channel
1 parent c9142ea commit 929cc71

File tree

1 file changed

+44
-22
lines changed

1 file changed

+44
-22
lines changed

files/code/lambda.py

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -197,24 +197,47 @@ def get_gitlab_user_email(user_id):
197197

198198
def send_slack_summary(stale_merge_requests, slack_client):
199199
"""Send summary of stale merge requests to fallback Slack channel."""
200-
summary = {}
201200
summary_message = f"""Total of *{len(stale_merge_requests)}* open merge requests not updated in the last {STALE_DAYS_THRESHOLD} days, in non-archived projects. \n
202201
_Note: If the numbers below do not match the merge requests in GitLab, you may not have permission to view them._\n\n"""
203202

204-
# Create assignee count
203+
# Create a dictionary to store unique merge requests per assignee
204+
merge_requests_by_assignee = {}
205205
for mr in stale_merge_requests:
206-
assignee_id = mr.get("assignee", {}).get("id", None)
207-
assignee_username = mr.get("assignee", {}).get("username", "Unassigned")
208-
assignee_state = mr.get("assignee", {}).get("state", None)
206+
assignee_id = mr.get("assignee", {}).get("id", "Unassigned")
207+
if assignee_id not in merge_requests_by_assignee:
208+
merge_requests_by_assignee[assignee_id] = set()
209+
merge_requests_by_assignee[assignee_id].add(mr["id"])
209210

210-
if assignee_id in summary:
211-
summary[assignee_id]["count"] += 1
211+
summary = {}
212+
for assignee_id, merge_request_ids in merge_requests_by_assignee.items():
213+
if assignee_id == "Unassigned":
214+
assignee_username = "Unassigned"
215+
assignee_email = None
216+
assignee_state = None
212217
else:
213-
summary[assignee_id] = {
214-
"count": 1,
215-
"username": assignee_username,
216-
"state": assignee_state,
217-
}
218+
assignee_info = next(
219+
(
220+
mr
221+
for mr in stale_merge_requests
222+
if mr["assignee"]["id"] == assignee_id
223+
),
224+
None,
225+
)
226+
if assignee_info:
227+
assignee_username = assignee_info["assignee"]["username"]
228+
assignee_email = get_gitlab_user_email(assignee_id)
229+
assignee_state = assignee_info["assignee"].get("state", None)
230+
else:
231+
assignee_username = "Unknown"
232+
assignee_email = None
233+
assignee_state = None
234+
235+
summary[assignee_id] = {
236+
"count": len(merge_request_ids),
237+
"username": assignee_username,
238+
"email": assignee_email,
239+
"state": assignee_state,
240+
}
218241

219242
# Sort summary assignees by count, descending
220243
sorted_summary = sorted(
@@ -234,20 +257,19 @@ def send_slack_summary(stale_merge_requests, slack_client):
234257
assignee_merge_url = f"{GITLAB_BASE_URL}/dashboard/merge_requests?scope=all&state=opened&{assignee_param}"
235258

236259
# Find Slack user ID to be able to mention them
237-
assignee_email = get_gitlab_user_email(assignee_id)
238-
slack_user_tag = assignee_email if assignee_email else data["username"]
260+
slack_user_tag = data["email"] if data["email"] else data["username"]
239261

240-
if assignee_email:
262+
if data["email"]:
241263
try:
242264
if INTERNAL_EMAIL_DOMAINS and any(
243-
domain in assignee_email for domain in INTERNAL_EMAIL_DOMAINS
265+
domain in data["email"] for domain in INTERNAL_EMAIL_DOMAINS
244266
):
245-
slack_user = slack_client.users_lookupByEmail(email=assignee_email)
267+
slack_user = slack_client.users_lookupByEmail(email=data["email"])
246268
user_id = slack_user["user"]["id"]
247269
slack_user_tag = f"<@{user_id}>"
248270
except SlackApiError as e:
249271
print(
250-
f"Error creating Slack user tag for {assignee_email}: {e.response['error']}"
272+
f"Error creating Slack user tag for {data['email']}: {e.response['error']}"
251273
)
252274

253275
if data["state"] == "blocked":
@@ -329,11 +351,11 @@ def send_slack_individual_mr(stale_merge_requests, slack_client):
329351
# Convert Slack message from list to string
330352
message = "\n".join(message_list)
331353

332-
# Gather all merge requests for recipient, rather than send one at a time
354+
# Gather all merge requests for recipient, using a set to ensure uniqueness
333355
if user_id in messages_by_recipient:
334-
messages_by_recipient[user_id].append(message)
356+
messages_by_recipient[user_id].add(message)
335357
else:
336-
messages_by_recipient[user_id] = [message]
358+
messages_by_recipient[user_id] = {message}
337359

338360
# Send Slack message
339361
for recipient, messages in messages_by_recipient.items():
@@ -347,7 +369,7 @@ def send_slack_individual_mr(stale_merge_requests, slack_client):
347369
intro = f"You have open merge requests that haven't been updated in the last {STALE_DAYS_THRESHOLD} days. Please review and take appropriate action."
348370
print(f"Sending Slack direct message to user {recipient}...")
349371

350-
message = intro + "".join(messages)
372+
message = intro + "\n".join(messages)
351373

352374
# Send Slack individual message
353375
try:

0 commit comments

Comments
 (0)