# This workflow automatically adds the appropriate reviewers to a pull request. # # The workflow directly reuses logic in the BaseTools/Scripts/GetMaintainer.py script # to determine the appropriate reviewers, so it matches what a user would see running # the script locally. # # Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: BSD-2-Clause-Patent name: Add Pull Request Reviewers on: pull_request_target: branches: - master types: [opened, ready_for_review, reopened, synchronize] env: GET_MAINTAINER_REL_PATH: "BaseTools/Scripts/GetMaintainer.py" jobs: auto-request-review: name: Add Pull Request Reviewers # Do not run on draft PRs and only run on PRs in the tianocore organization if: ${{ github.event.pull_request.draft == false && github.repository_owner == 'tianocore' }} runs-on: ubuntu-latest permissions: contents: read issues: write pull-requests: write steps: # Reduce checkout time with sparse-checkout # - .github: Contains the scripts to interact with Github and add reviewers # - BaseTools/Scripts: Contains the GetMaintainer.py script # - Maintainers.txt: Contains the list of maintainers for the repository - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 sparse-checkout: | .github BaseTools/Scripts Maintainers.txt - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install PIP Modules run: pip install edk2-pytool-library edk2-pytool-extensions requests - name: Add Reviewers to Pull Request shell: python env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} ORG_NAME: ${{ github.repository_owner }} PR_NUMBER: ${{ github.event.number}} REPO_NAME: ${{ github.event.pull_request.base.repo.name }} TARGET_BRANCH: ${{ github.event.pull_request.base.ref }} WORKSPACE_PATH: ${{ github.workspace }} run: | import logging import os import sys sys.path.append(os.path.join(os.environ['WORKSPACE_PATH'], ".github")) from edk2toollib.utility_functions import RunCmd from io import StringIO from scripts import GitHub WORKSPACE_PATH = os.environ['WORKSPACE_PATH'] GET_MAINTAINER_LOCAL_PATH = os.path.join(WORKSPACE_PATH, os.environ['GET_MAINTAINER_REL_PATH']) pr_commit_sha = GitHub.get_pr_sha(os.environ['GH_TOKEN'], os.environ['ORG_NAME'], os.environ['REPO_NAME'], os.environ['PR_NUMBER']) if not pr_commit_sha: sys.exit(1) print(f"::notice title=PR Commit SHA::Looking at files in consolidated PR commit: {pr_commit_sha}") out_stream_buffer = StringIO() cmd_ret = RunCmd( "git", f"fetch origin {pr_commit_sha}", workingdir=WORKSPACE_PATH, outstream=out_stream_buffer, logging_level=logging.INFO, ) if cmd_ret != 0: print( f"::error title=Commit Fetch Error!::Error fetching PR commit: [{cmd_ret}]: {out_stream_buffer.getvalue()}" ) sys.exit(1) reviewers = GitHub.get_reviewers_for_range(WORKSPACE_PATH, GET_MAINTAINER_LOCAL_PATH, pr_commit_sha, pr_commit_sha) if not reviewers: print("::notice title=No Reviewers Found!::No reviewers found for this PR.") sys.exit(1) print(f"::notice title=Reviewer List::Reviewers found for PR {os.environ['PR_NUMBER']}:\n{', '.join(reviewers)}") GitHub.add_reviewers_to_pr(os.environ['GH_TOKEN'], os.environ['ORG_NAME'], os.environ['REPO_NAME'], os.environ['PR_NUMBER'], reviewers)