diff options
author | Mehdi Amini <joker.eph@gmail.com> | 2023-09-08 22:54:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-08 22:54:53 -0700 |
commit | 4085cb380d8f95783842c11e1f41a474b0a11ef3 (patch) | |
tree | 7f617a196ac85bda4668cbc349269bd910b5019f | |
parent | 67635b6e2392bcb7cd4b1b6e74e150533f2d1657 (diff) | |
download | llvm-4085cb380d8f95783842c11e1f41a474b0a11ef3.zip llvm-4085cb380d8f95783842c11e1f41a474b0a11ef3.tar.gz llvm-4085cb380d8f95783842c11e1f41a474b0a11ef3.tar.bz2 |
Improve the pull-request subcription notification format by adding the description and files statistics (#65828)
-rwxr-xr-x | llvm/utils/git/github-automation.py | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/llvm/utils/git/github-automation.py b/llvm/utils/git/github-automation.py index 6fcd293..7df20ea 100755 --- a/llvm/utils/git/github-automation.py +++ b/llvm/utils/git/github-automation.py @@ -65,6 +65,14 @@ class IssueSubscriber: return False +def human_readable_size(size, decimal_places=2): + for unit in ["B", "KiB", "MiB", "GiB", "TiB", "PiB"]: + if size < 1024.0 or unit == "PiB": + break + size /= 1024.0 + return f"{size:.{decimal_places}f} {unit}" + + class PRSubscriber: @property def team_name(self) -> str: @@ -77,23 +85,62 @@ class PRSubscriber: self._team_name = "pr-subscribers-{}".format(label_name).lower() def run(self) -> bool: - for team in self.org.get_teams(): - if self.team_name != team.name.lower(): - continue - try: - # GitHub limits comments to 65,536 characters, let's limit our comments to 20,000. - patch = requests.get(self.pr.diff_url).text[0:20000] - except: - patch = "" - comment = ( - "@llvm/{}".format(team.slug) - + "\n\n<details><summary>Changes</summary><pre>\n" - + patch - + "\n</pre></details>" - ) - self.pr.as_issue().create_comment(comment) + patch = None + team = self._get_curent_team() + if not team: + print(f"couldn't find team named {self.team_name}") + return False + + # Get statistics for each file + diff_stats = f"{self.pr.changed_files} Files Affected:\n\n" + for file in self.pr.get_files(): + diff_stats += f"- ({file.status}) {file.filename} (" + if file.additions: + diff_stats += f"+{file.additions}" + if file.deletions: + diff_stats += f"-{file.deletions}" + diff_stats += ") " + if file.status == "renamed": + print(f"(from {file.previous_filename})") + diff_stats += "\n" + diff_stats += "\n" + + # Get the diff + try: + patch = requests.get(self.pr.diff_url).text + except: + patch = "" + diff_stats += "\n<pre>\n" + 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<truncated>\n" + diff_stats += "</pre>" + + body = self.pr.body + comment = ( + "@llvm/{}".format(team.slug) + + "\n\n<details>\n" + + f"<summary>Changes</summary>\n\n" + + f"{body}\n--\n" + + patch_link + + "\n" + + f"{diff_stats}\n\n" + + "</details>" + ) + + self.pr.as_issue().create_comment(comment) return True + def _get_curent_team(self) -> Optional[github.Team.Team]: + for team in self.org.get_teams(): + if self.team_name == team.name.lower(): + return team + return None + def setup_llvmbot_git(git_dir="."): """ @@ -199,7 +246,6 @@ def extract_commit_hash(arg: str): class ReleaseWorkflow: - CHERRY_PICK_FAILED_LABEL = "release:cherry-pick-failed" """ |