[llvm] github-automation: Use a single comment for team mentions on pull req… (PR #66037)

Tom Stellard via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 11 19:09:29 PDT 2023


https://github.com/tstellar created https://github.com/llvm/llvm-project/pull/66037:

…uests

This will reduce the number of notifications created when a pull request label is added.  Each team will only get a notification when their team's label is added and not when other teams' labels are added.

>From 15be1ddc1338261446786c7ad1149ac7a219a869 Mon Sep 17 00:00:00 2001
From: Tom Stellard <tstellar at redhat.com>
Date: Mon, 11 Sep 2023 18:57:42 -0700
Subject: [PATCH] github-automation: Use a single comment for team mentions on
 pull requests

This will reduce the number of notifications created when a pull request
label is added.  Each team will only get a notification when their
team's label is added and not when other teams' labels are added.
---
 .github/workflows/pr-subscriber.yml |  8 ++++++++
 llvm/utils/git/github-automation.py | 21 +++++++++++++++++++--
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/pr-subscriber.yml b/.github/workflows/pr-subscriber.yml
index 3b18c8b35e97d1a..14e6cb33c57f9f6 100644
--- a/.github/workflows/pr-subscriber.yml
+++ b/.github/workflows/pr-subscriber.yml
@@ -9,6 +9,14 @@ on:
 permissions:
   contents: read
 
+concurrency:
+  # Ideally, we would use the PR number in the concurrency group, but we don't
+  # have access to it here.  We need to ensure only one job is running for
+  # each PR at a time, because there is a potentaill race condition when
+  # updating the issue comment.
+  group: "PR Subscriber"
+  cancel-in-progress: false
+
 jobs:
   auto-subscribe:
     runs-on: ubuntu-latest
diff --git a/llvm/utils/git/github-automation.py b/llvm/utils/git/github-automation.py
index 7df20ea8457155b..a7b88ed383a1238 100755
--- a/llvm/utils/git/github-automation.py
+++ b/llvm/utils/git/github-automation.py
@@ -83,6 +83,15 @@ def __init__(self, token: str, repo: str, pr_number: int, label_name: str):
         self.org = github.Github(token).get_organization(self.repo.organization.login)
         self.pr = self.repo.get_issue(pr_number).as_pull_request()
         self._team_name = "pr-subscribers-{}".format(label_name).lower()
+        self.COMMENT_TAG = "<!--LLVM PR SUMMARY COMMENT-->\n"
+
+    def get_summary_comment(self) -> github.IssueComment.IssueComment:
+        for comment in self.pr.as_issue().get_comments():
+            if not self.COMMENT_TAG in comment.body:
+                continue
+            return comment
+        return None
+
 
     def run(self) -> bool:
         patch = None
@@ -119,10 +128,12 @@ def run(self) -> bool:
             patch_link = f"\nPatch is {human_readable_size(len(patch))}, truncated to {human_readable_size(DIFF_LIMIT)} below, full version: {self.pr.diff_url}\n"
             diff_stats = diff_stats[0:DIFF_LIMIT] + "...\n<truncated>\n"
         diff_stats += "</pre>"
+        team_mention = "@llvm/{}".format(team.slug)
 
         body = self.pr.body
         comment = (
-            "@llvm/{}".format(team.slug)
+            self.COMMENT_TAG
+            + team_mention
             + "\n\n<details>\n"
             + f"<summary>Changes</summary>\n\n"
             + f"{body}\n--\n"
@@ -132,7 +143,13 @@ def run(self) -> bool:
             + "</details>"
         )
 
-        self.pr.as_issue().create_comment(comment)
+        summary_comment = self.get_summary_comment()
+        if not summary_comment:
+            self.pr.as_issue().create_comment(comment)
+        elif team_mention + "\n" in summary_comment.body:
+            print("Team {} already mentioned.".format(team.slug))
+        else:
+            summary_comment.edit(summary_comment.body.replace(self.COMMENT_TAG, self.COMMENT_TAG + team_mention + "\n"))
         return True
 
     def _get_curent_team(self) -> Optional[github.Team.Team]:



More information about the llvm-commits mailing list