@@ -197,24 +197,47 @@ def get_gitlab_user_email(user_id):
197197
198198def 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