Skip to content

Commit f8ef269

Browse files
authored
workflows: Add some automation for commit access requests (#123113)
* Greet the user and ask them to read the developer policy. * Post their contribution stats on the issue.
1 parent 79df1c3 commit f8ef269

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Commit Access Greeter
2+
3+
on:
4+
issues:
5+
types:
6+
- labeled
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
commit-access-greeter:
13+
permissions:
14+
issues: write
15+
if: >-
16+
github.repository_owner == 'llvm' &&
17+
github.event.label.name == 'infra:commit-access-request'
18+
runs-on: ubuntu-22.04
19+
steps:
20+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
21+
with:
22+
sparse-checkout: llvm/utils/git/
23+
24+
- name: Setup Automation Script
25+
working-directory: ./llvm/utils/git/
26+
run: |
27+
pip install --require-hashes -r requirements.txt
28+
29+
- name: Add comments to issue
30+
working-directory: ./llvm/utils/git/
31+
env:
32+
LABEL_NAME: ${{ github.event.label.name }}
33+
GITHUB_TOKEN: ${{ github.token }}
34+
ISSUE_NUMBER: ${{ github.event.issue.number }}
35+
run: |
36+
python3 ./github-automation.py \
37+
--token $GITHUB_TOKEN \
38+
commit-request-greeter \
39+
--issue-number $ISSUE_NUMBER

llvm/utils/git/github-automation.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import re
1818
import requests
1919
import sys
20+
import textwrap
2021
import time
2122
from typing import List, Optional
2223

@@ -209,6 +210,14 @@ def _get_current_team(self) -> Optional[github.Team.Team]:
209210
return None
210211

211212

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+
212221
class PRGreeter:
213222
COMMENT_TAG = "<!--LLVM NEW CONTRIBUTOR COMMENT-->\n"
214223

@@ -241,6 +250,60 @@ def run(self) -> bool:
241250
return True
242251

243252

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+
244307
class PRBuildbotInformation:
245308
COMMENT_TAG = "<!--LLVM BUILDBOT INFORMATION COMMENT-->\n"
246309

@@ -676,6 +739,9 @@ def request_release_note(token: str, repo_name: str, pr_number: int):
676739
pr_greeter_parser = subparsers.add_parser("pr-greeter")
677740
pr_greeter_parser.add_argument("--issue-number", type=int, required=True)
678741

742+
commit_request_greeter = subparsers.add_parser("commit-request-greeter")
743+
commit_request_greeter.add_argument("--issue-number", type=int, required=True)
744+
679745
pr_buildbot_information_parser = subparsers.add_parser("pr-buildbot-information")
680746
pr_buildbot_information_parser.add_argument("--issue-number", type=int, required=True)
681747
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):
746812
elif args.command == "pr-greeter":
747813
pr_greeter = PRGreeter(args.token, args.repo, args.issue_number)
748814
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()
749818
elif args.command == "pr-buildbot-information":
750819
pr_buildbot_information = PRBuildbotInformation(
751820
args.token, args.repo, args.issue_number, args.author

0 commit comments

Comments
 (0)