From e61c09bc85eda86d207d557d8bde929fe69d5287 Mon Sep 17 00:00:00 2001 From: Mary Date: Wed, 12 Jul 2023 18:31:08 +0200 Subject: [PATCH] infra: Fix PR triage once and for all (#5442) Switch to a custom made python script that query GitHub API to grab latest state of the PR after label assign. --- .github/assign/audio.yml | 8 ---- .github/assign/cpu.yml | 11 ----- .github/assign/global.yml | 4 -- .github/assign/gpu.yml | 10 ----- .github/assign/gui.yml | 11 ----- .github/assign/horizon.yml | 11 ----- .github/assign/infra.yml | 9 ---- .github/reviewers.yml | 32 +++++++++++++ .github/update_reviewers.py | 79 +++++++++++++++++++++++++++++++++ .github/workflows/pr_triage.yml | 48 ++++++-------------- 10 files changed, 125 insertions(+), 98 deletions(-) delete mode 100644 .github/assign/audio.yml delete mode 100644 .github/assign/cpu.yml delete mode 100644 .github/assign/global.yml delete mode 100644 .github/assign/gpu.yml delete mode 100644 .github/assign/gui.yml delete mode 100644 .github/assign/horizon.yml delete mode 100644 .github/assign/infra.yml create mode 100644 .github/reviewers.yml create mode 100644 .github/update_reviewers.py diff --git a/.github/assign/audio.yml b/.github/assign/audio.yml deleted file mode 100644 index 337007d3..00000000 --- a/.github/assign/audio.yml +++ /dev/null @@ -1,8 +0,0 @@ -addReviewers: true - -reviewers: - - marysaka - -filterLabels: - include: - - audio \ No newline at end of file diff --git a/.github/assign/cpu.yml b/.github/assign/cpu.yml deleted file mode 100644 index da824bdc..00000000 --- a/.github/assign/cpu.yml +++ /dev/null @@ -1,11 +0,0 @@ -addReviewers: true - -reviewers: - - gdkchan - - riperiperi - - marysaka - - LDj3SNuD - -filterLabels: - include: - - cpu \ No newline at end of file diff --git a/.github/assign/global.yml b/.github/assign/global.yml deleted file mode 100644 index 53a9af42..00000000 --- a/.github/assign/global.yml +++ /dev/null @@ -1,4 +0,0 @@ -addReviewers: true - -reviewers: - - Ryujinx/developers \ No newline at end of file diff --git a/.github/assign/gpu.yml b/.github/assign/gpu.yml deleted file mode 100644 index b96d9d87..00000000 --- a/.github/assign/gpu.yml +++ /dev/null @@ -1,10 +0,0 @@ -addReviewers: true - -reviewers: - - gdkchan - - riperiperi - - marysaka - -filterLabels: - include: - - gpu \ No newline at end of file diff --git a/.github/assign/gui.yml b/.github/assign/gui.yml deleted file mode 100644 index 9731ea5b..00000000 --- a/.github/assign/gui.yml +++ /dev/null @@ -1,11 +0,0 @@ -addReviewers: true - -reviewers: - - Ack77 - - emmauss - - TSRBerry - - marysaka - -filterLabels: - include: - - gui \ No newline at end of file diff --git a/.github/assign/horizon.yml b/.github/assign/horizon.yml deleted file mode 100644 index 966382b2..00000000 --- a/.github/assign/horizon.yml +++ /dev/null @@ -1,11 +0,0 @@ -addReviewers: true - -reviewers: - - gdkchan - - Ack77 - - marysaka - - TSRBerry - -filterLabels: - include: - - horizon \ No newline at end of file diff --git a/.github/assign/infra.yml b/.github/assign/infra.yml deleted file mode 100644 index d319fef1..00000000 --- a/.github/assign/infra.yml +++ /dev/null @@ -1,9 +0,0 @@ -addReviewers: true - -reviewers: - - marysaka - - TSRBerry - -filterLabels: - include: - - infra \ No newline at end of file diff --git a/.github/reviewers.yml b/.github/reviewers.yml new file mode 100644 index 00000000..83d313e3 --- /dev/null +++ b/.github/reviewers.yml @@ -0,0 +1,32 @@ +audio: + - marysaka + +cpu: + - gdkchan + - riperiperi + - marysaka + - LDj3SNuD + +gpu: + - gdkchan + - riperiperi + - marysaka + +gui: + - Ack77 + - emmauss + - TSRBerry + - marysaka + +horizon: + - gdkchan + - Ack77 + - marysaka + - TSRBerry + +infra: + - marysaka + - TSRBerry + +default: + - "@Ryujinx/developers" diff --git a/.github/update_reviewers.py b/.github/update_reviewers.py new file mode 100644 index 00000000..14c0cc28 --- /dev/null +++ b/.github/update_reviewers.py @@ -0,0 +1,79 @@ +from pathlib import Path +from typing import List, Set +from github import Github +from github.Repository import Repository +from github.GithubException import GithubException + +import sys +import yaml + + +def add_reviewers( + reviewers: Set[str], team_reviewers: Set[str], new_entries: List[str] +): + for reviewer in new_entries: + if reviewer.startswith("@"): + team_reviewers.add(reviewer[1:]) + else: + reviewers.add(reviewer) + + +def update_reviewers(config, repo: Repository, pr_id: int) -> int: + pull_request = repo.get_pull(pr_id) + + if not pull_request: + sys.stderr.writable(f"Unknown PR #{pr_id}\n") + return 1 + + pull_request_author = pull_request.user.login + reviewers = set() + team_reviewers = set() + + for label in pull_request.labels: + if label.name in config: + add_reviewers(reviewers, team_reviewers, config[label.name]) + + if "default" in config: + add_reviewers(reviewers, team_reviewers, config["default"]) + + if pull_request_author in reviewers: + reviewers.remove(pull_request_author) + + try: + reviewers = list(reviewers) + team_reviewers = list(team_reviewers) + print( + f"Attempting to assign reviewers ({reviewers}) and team_reviewers ({team_reviewers})" + ) + pull_request.create_review_request(reviewers, team_reviewers) + return 0 + except GithubException as e: + sys.stderr.write(f"Cannot assign review request for PR #{pr_id}: {e}\n") + return 1 + + +if __name__ == "__main__": + if len(sys.argv) != 5: + sys.stderr.write("usage: \n") + sys.exit(1) + + token = sys.argv[1] + repo_path = sys.argv[2] + pr_id = int(sys.argv[3]) + config_path = Path(sys.argv[4]) + + g = Github(token) + repo = g.get_repo(repo_path) + + if not repo: + sys.stderr.write("Repository not found!\n") + sys.exit(1) + + if not config_path.exists(): + sys.stderr.write(f'Config "{config_path}" not found!\n') + sys.exit(1) + + with open(config_path, "r") as f: + config = yaml.safe_load(f) + + sys.exit(update_reviewers(config, repo, pr_id)) diff --git a/.github/workflows/pr_triage.yml b/.github/workflows/pr_triage.yml index e32dd27a..86e5084f 100644 --- a/.github/workflows/pr_triage.yml +++ b/.github/workflows/pr_triage.yml @@ -12,43 +12,23 @@ jobs: runs-on: ubuntu-latest steps: + # Grab sources to get update_reviewers.py and reviewers.yml + - name: Fetch sources + uses: actions/checkout@v3 + with: + # Ensure we pin the source origin as pull_request_target run under forks. + fetch-depth: 0 + repository: Ryujinx/Ryujinx + ref: master + - name: Update labels based on changes uses: actions/labeler@v4 with: sync-labels: true dot: true - - name: Auto Assign [Audio] - uses: kentaro-m/auto-assign-action@v1.2.5 - with: - configuration-path: '.github/assign/audio.yml' - - - name: Auto Assign [CPU] - uses: kentaro-m/auto-assign-action@v1.2.5 - with: - configuration-path: '.github/assign/cpu.yml' - - - name: Auto Assign [GPU] - uses: kentaro-m/auto-assign-action@v1.2.5 - with: - configuration-path: '.github/assign/gpu.yml' - - - name: Auto Assign [GUI] - uses: kentaro-m/auto-assign-action@v1.2.5 - with: - configuration-path: '.github/assign/gui.yml' - - - name: Auto Assign [Horizon] - uses: kentaro-m/auto-assign-action@v1.2.5 - with: - configuration-path: '.github/assign/horizon.yml' - - - name: Auto Assign [Infra] - uses: kentaro-m/auto-assign-action@v1.2.5 - with: - configuration-path: '.github/assign/infra.yml' - - - name: Auto Assign [Global] - uses: kentaro-m/auto-assign-action@v1.2.5 - with: - configuration-path: '.github/assign/global.yml' \ No newline at end of file + - name: Assign reviewers + run: | + pip3 install PyGithub + python3 .github/update_reviewers.py ${{ secrets.GITHUB_TOKEN }} ${{ github.repository }} ${{ github.event.pull_request.number }} .github/reviewers.yml + shell: bash