|
17 | 17 | import re
|
18 | 18 | import requests
|
19 | 19 | import sys
|
| 20 | +import textwrap |
20 | 21 | import time
|
21 | 22 | from typing import List, Optional
|
22 | 23 |
|
@@ -209,6 +210,14 @@ def _get_current_team(self) -> Optional[github.Team.Team]:
|
209 | 210 | return None
|
210 | 211 |
|
211 | 212 |
|
| 213 | +def get_top_values(values: dict, top: int = 3) -> list: |
| 214 | + return [v for v in sorted(values.items(), key=lambda x: x[1], reverse=True)][:top] |
| 215 | + |
| 216 | + |
| 217 | +def get_user_values_str(values: list) -> str: |
| 218 | + return ", ".join([f"@{v[0]} ({v[1]})" for v in values]) |
| 219 | + |
| 220 | + |
212 | 221 | class PRGreeter:
|
213 | 222 | COMMENT_TAG = "<!--LLVM NEW CONTRIBUTOR COMMENT-->\n"
|
214 | 223 |
|
@@ -241,6 +250,60 @@ def run(self) -> bool:
|
241 | 250 | return True
|
242 | 251 |
|
243 | 252 |
|
| 253 | +class CommitRequestGreeter: |
| 254 | + def __init__(self, token: str, repo: str, issue_number: int): |
| 255 | + self.repo = github.Github(token).get_repo(repo) |
| 256 | + self.issue = self.repo.get_issue(issue_number) |
| 257 | + |
| 258 | + def run(self) -> bool: |
| 259 | + # Post greeter comment: |
| 260 | + comment = textwrap.dedent( |
| 261 | + f""" |
| 262 | + @{self.issue.user.login} thank you for apply for commit access. Please review the project's [code review policy](https://llvm.org/docs/CodeReview.html). |
| 263 | + """ |
| 264 | + ) |
| 265 | + self.issue.create_comment(comment) |
| 266 | + |
| 267 | + # Post activity summary: |
| 268 | + total_prs = 0 |
| 269 | + merged_prs = 0 |
| 270 | + merged_by = {} |
| 271 | + reviewed_by = {} |
| 272 | + for i in self.repo.get_issues(creator=self.issue.user.login, state="all"): |
| 273 | + issue_reviewed_by = set() |
| 274 | + try: |
| 275 | + pr = i.as_pull_request() |
| 276 | + total_prs += 1 |
| 277 | + for c in pr.get_review_comments(): |
| 278 | + if c.user.login == self.issue.user.login: |
| 279 | + continue |
| 280 | + issue_reviewed_by.add(c.user.login) |
| 281 | + for r in issue_reviewed_by: |
| 282 | + if r not in reviewed_by: |
| 283 | + reviewed_by[r] = 1 |
| 284 | + else: |
| 285 | + reviewed_by[r] += 1 |
| 286 | + if pr.is_merged(): |
| 287 | + merged_prs += 1 |
| 288 | + merger = pr.merged_by.login |
| 289 | + if merger not in merged_by: |
| 290 | + merged_by[merger] = 1 |
| 291 | + else: |
| 292 | + merged_by[merger] += 1 |
| 293 | + continue |
| 294 | + |
| 295 | + except github.GithubException: |
| 296 | + continue |
| 297 | + |
| 298 | + comment = f""" |
| 299 | + ### Activity Summary: |
| 300 | + * [{total_prs} Pull Requests](https://github.com/llvm/llvm-project/pulls/{self.issue.user.login}) ({merged_prs} merged) |
| 301 | + * Top 3 Committers: {get_user_values_str(get_top_values(merged_by))} |
| 302 | + * Top 3 Reviewers: {get_user_values_str(get_top_values(reviewed_by))} |
| 303 | + """ |
| 304 | + self.issue.create_comment(textwrap.dedent(comment)) |
| 305 | + |
| 306 | + |
244 | 307 | class PRBuildbotInformation:
|
245 | 308 | COMMENT_TAG = "<!--LLVM BUILDBOT INFORMATION COMMENT-->\n"
|
246 | 309 |
|
@@ -676,6 +739,9 @@ def request_release_note(token: str, repo_name: str, pr_number: int):
|
676 | 739 | pr_greeter_parser = subparsers.add_parser("pr-greeter")
|
677 | 740 | pr_greeter_parser.add_argument("--issue-number", type=int, required=True)
|
678 | 741 |
|
| 742 | +commit_request_greeter = subparsers.add_parser("commit-request-greeter") |
| 743 | +commit_request_greeter.add_argument("--issue-number", type=int, required=True) |
| 744 | + |
679 | 745 | pr_buildbot_information_parser = subparsers.add_parser("pr-buildbot-information")
|
680 | 746 | pr_buildbot_information_parser.add_argument("--issue-number", type=int, required=True)
|
681 | 747 | pr_buildbot_information_parser.add_argument("--author", type=str, required=True)
|
@@ -746,6 +812,9 @@ def request_release_note(token: str, repo_name: str, pr_number: int):
|
746 | 812 | elif args.command == "pr-greeter":
|
747 | 813 | pr_greeter = PRGreeter(args.token, args.repo, args.issue_number)
|
748 | 814 | pr_greeter.run()
|
| 815 | +elif args.command == "commit-request-greeter": |
| 816 | + commit_greeter = CommitRequestGreeter(args.token, args.repo, args.issue_number) |
| 817 | + commit_greeter.run() |
749 | 818 | elif args.command == "pr-buildbot-information":
|
750 | 819 | pr_buildbot_information = PRBuildbotInformation(
|
751 | 820 | args.token, args.repo, args.issue_number, args.author
|
|
0 commit comments