diff --git a/llvm/utils/git/github-automation.py b/llvm/utils/git/github-automation.py index eac5816b5499f..5c90ca8bb7150 100755 --- a/llvm/utils/git/github-automation.py +++ b/llvm/utils/git/github-automation.py @@ -47,6 +47,16 @@ def _get_curent_team(team_name, teams) -> Optional[github.Team.Team]: return None +def escape_description(str): + # https://github.com/github/markup/issues/1168#issuecomment-494946168 + str = html.escape(str, False) + # '@' followed by alphanum is a user name + str = re.sub("@(?=\w+)", "@", str) + # '#' followed by digits is considered an issue number + str = re.sub("#(?=\d+\s)", "#", str) + return str + + class IssueSubscriber: @property def team_name(self) -> str: @@ -67,12 +77,15 @@ def run(self) -> bool: if team.slug == "issue-subscribers-good-first-issue": comment = "{}\n".format(beginner_comment) - comment = ( - f"@llvm/{team.slug}" - + "\n\n
\n" - + f"{self.issue.body}\n" - + "
" - ) + body = escape_description(self.issue.body) + + comment = f""" +@llvm/{team.slug} + +
+{body} +
+""" self.issue.create_comment(comment) return True @@ -113,6 +126,11 @@ def run(self) -> bool: print(f"couldn't find team named {self.team_name}") return False + # GitHub limits comments to 65,536 characters, let's limit the diff + # and the file list to 20kB each. + STAT_LIMIT = 20 * 1024 + DIFF_LIMIT = 20 * 1024 + # Get statistics for each file diff_stats = f"{self.pr.changed_files} Files Affected:\n\n" for file in self.pr.get_files(): @@ -125,35 +143,41 @@ def run(self) -> bool: if file.status == "renamed": print(f"(from {file.previous_filename})") diff_stats += "\n" - diff_stats += "\n" + if len(diff_stats) > STAT_LIMIT: + break # Get the diff try: - patch = html.escape(requests.get(self.pr.diff_url).text) + patch = requests.get(self.pr.diff_url).text except: patch = "" - diff_stats += "\n
\n" + html.escape(patch)
 
-        # GitHub limits comments to 65,536 characters, let's limit the diff to 20kB.
-        DIFF_LIMIT = 20 * 1024
         patch_link = f"Full diff: {self.pr.diff_url}\n"
         if len(patch) > DIFF_LIMIT:
             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\n"
-        diff_stats += "
" + patch = patch[0:DIFF_LIMIT] + "...\n[truncated]\n" team_mention = "@llvm/{}".format(team.slug) - body = self.pr.body + body = escape_description(self.pr.body) + # Note: the comment is in markdown and the code below + # is sensible to line break comment = f""" {self.COMMENT_TAG} {team_mention} - +
Changes + {body} --- +--- {patch_link} + {diff_stats} + +``````````diff +{patch} +`````````` +
"""