diff --git a/.github/scripts/GitHub.py b/.github/scripts/GitHub.py index cd6bea5205f7..38d9e6ac8519 100644 --- a/.github/scripts/GitHub.py +++ b/.github/scripts/GitHub.py @@ -5,20 +5,58 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent # +import git import logging import re -import requests from collections import OrderedDict -from edk2toollib.utility_functions import RunCmd, RunPythonScript +from edk2toollib.utility_functions import RunPythonScript +from github import Auth, Github, GithubException from io import StringIO from typing import List + """GitHub API helper functions.""" +def _authenticate(token: str): + """Authenticate to GitHub using a token. + + Args: + token (str): The GitHub token to use for authentication. + + Returns: + Github: A GitHub instance. + """ + auth = Auth.Token(token) + return Github(auth=auth) + + +def _get_pr(token: str, owner: str, repo: str, pr_number: int): + """Get the PR object from GitHub. + + Args: + token (str): The GitHub token to use for authentication. + owner (str): The GitHub owner (organization) name. + repo (str): The GitHub repository name (e.g. 'edk2'). + pr_number (int): The pull request number. + + Returns: + PullRequest: The PullRequest object. + """ + try: + g = _authenticate(token) + return g.get_repo(f"{owner}/{repo}").get_pull(pr_number) + except GithubException as ge: + print( + f"::error title=Error Getting PR {pr_number} Info!::" + f"{ge.data['message']}" + ) + return None + + def leave_pr_comment( - token: str, owner: str, repo: str, pr_number: str, comment_body: str + token: str, owner: str, repo: str, pr_number: int, comment_body: str ): """Leaves a comment on a PR. @@ -26,50 +64,54 @@ def leave_pr_comment( token (str): The GitHub token to use for authentication. owner (str): The GitHub owner (organization) name. repo (str): The GitHub repository name (e.g. 'edk2'). - pr_number (str): The pull request number. + pr_number (int): The pull request number. comment_body (str): The comment text. Markdown is supported. """ - url = f"https://api.github.com/repos/{owner}/{repo}/issues/{pr_number}/comments" - headers = { - "Authorization": f"Bearer {token}", - "Accept": "application/vnd.github.v3+json", - } - data = {"body": comment_body} - response = requests.post(url, json=data, headers=headers) - response.raise_for_status() - - -def get_reviewers_for_current_branch( - workspace_path: str, maintainer_file_path: str, target_branch: str = "master" + if pr := _get_pr(token, owner, repo, pr_number): + try: + pr.create_issue_comment(comment_body) + except GithubException as ge: + print( + f"::error title=Error Commenting on PR {pr_number}!::" + f"{ge.data['message']}" + ) + + +def get_reviewers_for_range( + workspace_path: str, + maintainer_file_path: str, + range_start: str = "master", + range_end: str = "HEAD", ) -> List[str]: """Get the reviewers for the current branch. + !!! note + This function accepts a range of commits and returns the reviewers + for that set of commits as a single list of GitHub usernames. To get + the reviewers for a single commit, set `range_start` and `range_end` + to the commit SHA. + Args: workspace_path (str): The workspace path. maintainer_file_path (str): The maintainer file path. - target_branch (str, optional): The name of the target branch that the - current HEAD will merge to. Defaults to "master". + range_start (str, optional): The range start ref. Defaults to "master". + range_end (str, optional): The range end ref. Defaults to "HEAD". Returns: List[str]: A list of GitHub usernames. """ - - commit_stream_buffer = StringIO() - cmd_ret = RunCmd( - "git", - f"log --format=format:%H {target_branch}..HEAD", - workingdir=workspace_path, - outstream=commit_stream_buffer, - logging_level=logging.INFO, - ) - if cmd_ret != 0: - print( - f"::error title=Commit Lookup Error!::Error getting branch commits: [{cmd_ret}]: {commit_stream_buffer.getvalue()}" - ) - return [] + if range_start == range_end: + commits = [range_start] + else: + commits = [ + c.hexsha + for c in git.Repo(workspace_path).iter_commits( + f"{range_start}..{range_end}" + ) + ] raw_reviewers = [] - for commit_sha in commit_stream_buffer.getvalue().splitlines(): + for commit_sha in commits: reviewer_stream_buffer = StringIO() cmd_ret = RunPythonScript( maintainer_file_path, @@ -80,7 +122,9 @@ def get_reviewers_for_current_branch( ) if cmd_ret != 0: print( - f"::error title=Reviewer Lookup Error!::Error calling GetMaintainer.py: [{cmd_ret}]: {reviewer_stream_buffer.getvalue()}" + f"::error title=Reviewer Lookup Error!::Error calling " + f"GetMaintainer.py: [{cmd_ret}]: " + f"{reviewer_stream_buffer.getvalue()}" ) return [] @@ -92,7 +136,8 @@ def get_reviewers_for_current_branch( return [] print( - f"::debug title=Commit {commit_sha[:7]} Reviewer(s)::{', '.join(matches)}" + f"::debug title=Commit {commit_sha[:7]} " + f"Reviewer(s)::{', '.join(matches)}" ) raw_reviewers.extend(matches) @@ -104,35 +149,34 @@ def get_reviewers_for_current_branch( return reviewers -def download_gh_file(github_url: str, local_path: str, token=None): - """Downloads a file from GitHub. +def get_pr_sha(token: str, owner: str, repo: str, pr_number: int) -> str: + """Returns the commit SHA of given PR branch. + + This returns the SHA of the merge commit that GitHub creates from a + PR branch. This commit contains all of the files in the PR branch in + a single commit. Args: - github_url (str): The GitHub raw file URL. - local_path (str): A local path to write the file contents to. - token (_type_, optional): A GitHub authentication token. - Only needed for a private repo. Defaults to None. - """ - headers = {} - if token: - headers["Authorization"] = f"Bearer {token}" + token (str): The GitHub token to use for authentication. + owner (str): The GitHub owner (organization) name. + repo (str): The GitHub repository name (e.g. 'edk2'). + pr_number (int): The pull request number. - try: - response = requests.get(github_url, headers=headers) - response.raise_for_status() - except requests.exceptions.HTTPError: - print( - f"::error title=HTTP Error!::Error downloading {github_url}: {response.reason}" - ) - return + Returns: + str: The commit SHA of the PR branch. An empty string is returned + if the request fails. + """ + if pr := _get_pr(token, owner, repo, pr_number): + merge_commit_sha = pr.merge_commit_sha + print(f"::debug title=PR {pr_number} Merge Commit SHA::{merge_commit_sha}") + return merge_commit_sha - with open(local_path, "w", encoding="utf-8") as file: - file.write(response.text) + return "" def add_reviewers_to_pr( - token: str, owner: str, repo: str, pr_number: str, user_names: List[str] -): + token: str, owner: str, repo: str, pr_number: int, user_names: List[str] +) -> List[str]: """Adds the set of GitHub usernames as reviewers to the PR. Args: @@ -141,47 +185,97 @@ def add_reviewers_to_pr( repo (str): The GitHub repository name (e.g. 'edk2'). pr_number (str): The pull request number. user_names (List[str]): List of GitHub usernames to add as reviewers. + + Returns: + List[str]: A list of GitHub usernames that were successfully added as + reviewers to the PR. This list will exclude any reviewers + from the list provided if they are not relevant to the PR. """ - headers = { - "Authorization": f"Bearer {token}", - "Accept": "application/vnd.github.v3+json", - } - pr_author_url = f"https://api.github.com/repos/{owner}/{repo}/pulls/{pr_number}" - url = f"https://api.github.com/repos/{owner}/{repo}/pulls/{pr_number}/requested_reviewers" - - response = requests.get(pr_author_url, headers=headers) - if response.status_code != 200: - print(f"::error title=HTTP Error!::Error getting PR author: {response.reason}") - return - pr_author = response.json().get("user").get("login").strip() - while pr_author in user_names: - user_names.remove(pr_author) - data = {"reviewers": user_names} - response = requests.post(url, json=data, headers=headers) + if not user_names: + print( + "::debug title=No PR Reviewers Requested!::" + "The list of PR reviewers is empty so not adding any reviewers." + ) + return [] + try: - response.raise_for_status() - except requests.exceptions.HTTPError: - if ( - response.status_code == 422 - and "Reviews may only be requested from collaborators" - in response.json().get("message") - ): - print( - f"::error title=User is not a Collaborator!::{response.json().get('message')}" - ) + g = _authenticate(token) + repo_gh = g.get_repo(f"{owner}/{repo}") + pr = repo_gh.get_pull(pr_number) + except GithubException as ge: + print( + f"::error title=Error Getting PR {pr_number} Info!::" + f"{ge.data['message']}" + ) + return None + + # The pull request author cannot be a reviewer. + pr_author = pr.user.login.strip() + + # The current PR reviewers do not need to be requested again. + current_pr_requested_reviewers = [ + r.login.strip() for r in pr.get_review_requests()[0] + ] + current_pr_reviewed_reviewers = [r.user.login.strip() for r in pr.get_reviews()] + current_pr_reviewers = list( + set(current_pr_requested_reviewers + current_pr_reviewed_reviewers) + ) + + # A user can only be added if they are a collaborator of the repository. + repo_collaborators = [c.login.strip() for c in repo_gh.get_collaborators()] + non_collaborators = [u for u in user_names if u not in repo_collaborators] + + excluded_pr_reviewers = [pr_author] + current_pr_reviewers + non_collaborators + new_pr_reviewers = [u for u in user_names if u not in excluded_pr_reviewers] + + # Notify the admins of the repository if non-collaborators are requested. + if non_collaborators: + print( + f"::warning title=Non-Collaborator Reviewers Found!::" + f"{', '.join(non_collaborators)}" + ) + + for comment in pr.get_issue_comments(): + # If a comment has already been made for these non-collaborators, + # do not make another comment. + if ( + comment.user.login == "github-actions[bot]" + and "WARNING: Cannot add some reviewers" in comment.body + and all(u in comment.body for u in non_collaborators) + ): + break + else: + repo_admins = [ + a.login for a in repo_gh.get_collaborators(permission="admin") + ] + leave_pr_comment( token, owner, repo, pr_number, - f"⚠ **WARNING: Cannot add reviewers**: A user specified as a " - f"reviewer for this PR is not a collaborator " - f"of the edk2 repository. Please add them as a collaborator to the " - f"repository and re-request the review.\n\n" - f"Users requested:\n{', '.join(user_names)}", - ) - elif response.status_code == 422: - print( - "::error title=Invalid Request!::The request is invalid. " - "Verify the API request string." + f"⚠ **WARNING: Cannot add some reviewers**: A user " + f"specified as a reviewer for this PR is not a collaborator " + f"of the repository. Please add them as a collaborator to " + f"the repository so they can be requested in the future.\n\n" + f"Non-collaborators requested:\n" + f"{'\n'.join([f'- @{c}' for c in non_collaborators])}" + f"\n\nAttn Admins:\n" + f"{'\n'.join([f'- @{a}' for a in repo_admins])}\n---\n" + f"Admin Instructions:\n" + f"- Add the non-collaborators as collaborators to the " + f"appropriate team(s) listed in " + f"[teams](https://github.com/orgs/tianocore/teams)\n" + f"- If they are no longer needed as reviewers, remove them " + f"from [`Maintainers.txt`](https://github.com/tianocore/edk2/blob/HEAD/Maintainers.txt)", ) + + # Add any new reviewers to the PR if needed. + if new_pr_reviewers: + print( + f"::debug title=Adding New PR Reviewers::" f"{', '.join(new_pr_reviewers)}" + ) + + pr.create_review_request(reviewers=new_pr_reviewers) + + return new_pr_reviewers diff --git a/.github/scripts/RequestPrReviewers.py b/.github/scripts/RequestPrReviewers.py new file mode 100644 index 000000000000..fdff65761708 --- /dev/null +++ b/.github/scripts/RequestPrReviewers.py @@ -0,0 +1,98 @@ +## @file +# Used in a CI workflow to request reviewers for a pull request. +# +# Refer to the following link for a list of pre-defined GitHub workflow +# environment variables: +# https://docs.github.com/actions/reference/environment-variables +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +import git +import GitHub +import os +import sys + + +"""Request Pull Request Reviewers Helpers""" + + +def request_pr_reviewers(): + """Request pull request reviewers for a GitHub PR. + + This function is intended to be used in a GitHub Actions workflow to + request reviewers for a pull request triggered by a GitHub event. The + function makes assumptions about GitHub workflow environment variables and + the pull request context in which it is run. + + The function will exit with a non-zero status indicating an error if a + critical error occurs during execution so the workflow fails. + + The following environment variables are expected to be set before calling + this function. The recommend GitHub context values are show for reference: + 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 }} + """ + WORKSPACE_PATH = os.environ["WORKSPACE_PATH"] + GET_MAINTAINER_LOCAL_PATH = os.path.join( + WORKSPACE_PATH, os.environ["GET_MAINTAINER_REL_PATH"] + ) + + # Step 1: Get the GitHub created PR commit SHA (contains all changes in a single commit) + pr_commit_sha = GitHub.get_pr_sha( + os.environ["GH_TOKEN"], + os.environ["ORG_NAME"], + os.environ["REPO_NAME"], + int(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}" + ) + + # Step 2: Fetch only the PR commit to get the files changed in the PR + git.Repo(WORKSPACE_PATH).remotes.origin.fetch(pr_commit_sha, depth=1) + + # Step 3: Get the list of reviewers for the PR + 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 New Reviewers Found!::No reviewers found for this PR.") + sys.exit(0) + + print( + f"::notice title=Preliminary Reviewer List::Total reviewer candidates for " + f"PR {os.environ['PR_NUMBER']}: {', '.join(reviewers)}" + ) + + # Step 4: Add the reviewers to the PR + # Note the final requested reviewer list in the workflow run for reference + new_reviewers = GitHub.add_reviewers_to_pr( + os.environ["GH_TOKEN"], + os.environ["ORG_NAME"], + os.environ["REPO_NAME"], + int(os.environ["PR_NUMBER"]), + reviewers, + ) + if new_reviewers: + print( + f"::notice title=New Reviewers Added::New reviewers requested for PR " + f"{os.environ['PR_NUMBER']}: {', '.join(new_reviewers)}" + ) + else: + print( + "::notice title=No New Reviewers Added::No reviewers were found that " + "should be newly requested." + ) + + +if __name__ == '__main__': + request_pr_reviewers() diff --git a/.github/scripts/requirements.txt b/.github/scripts/requirements.txt new file mode 100644 index 000000000000..c589084ab035 --- /dev/null +++ b/.github/scripts/requirements.txt @@ -0,0 +1,13 @@ +## @file +# GitHub Helpers Python PIP requirements file +# +# This file provides the list of python components used in GitHub scripts in this repository. +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +edk2-pytool-library==0.* +GitPython==3.* +PyGithub==2.* diff --git a/.github/workflows/request-reviews.yml b/.github/workflows/request-reviews.yml index 4f43d5612221..56776bbc0f35 100644 --- a/.github/workflows/request-reviews.yml +++ b/.github/workflows/request-reviews.yml @@ -11,7 +11,7 @@ name: Add Pull Request Reviewers on: - pull_request: + pull_request_target: branches: - master types: [opened, ready_for_review, reopened, synchronize] @@ -23,7 +23,7 @@ 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' }} + if: ${{ github.event.pull_request.draft == false && github.repository_owner == 'makubacki' }} runs-on: ubuntu-latest permissions: @@ -35,18 +35,23 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 1 + sparse-checkout: | + .github + BaseTools/Scripts + Maintainers.txt - - name: Set up Python + - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.x' + cache: 'pip' + cache-dependency-path: '.github/scripts/requirements.txt' - name: Install PIP Modules - run: pip install edk2-pytool-library edk2-pytool-extensions requests + run: pip install -r .github/scripts/requirements.txt --upgrade - name: Add Reviewers to Pull Request - shell: python env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} ORG_NAME: ${{ github.repository_owner }} @@ -54,20 +59,4 @@ jobs: REPO_NAME: ${{ github.event.pull_request.base.repo.name }} TARGET_BRANCH: ${{ github.event.pull_request.base.ref }} WORKSPACE_PATH: ${{ github.workspace }} - run: | - import os - import sys - sys.path.append(os.path.join(os.environ['WORKSPACE_PATH'], ".github")) - 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']) - - reviewers = GitHub.get_reviewers_for_current_branch(WORKSPACE_PATH, GET_MAINTAINER_LOCAL_PATH, f"origin/{os.environ['TARGET_BRANCH']}") - 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) + run: python .github/scripts/RequestPrReviewers.py diff --git a/Maintainers.txt b/Maintainers.txt index d22929b85b97..ae6415b329ad 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -134,543 +134,26 @@ R: Liming Gao [lgao4] EDK II Packages: ---------------- -ArmPkg -F: ArmPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ArmPkg -M: Leif Lindholm [leiflindholm] -M: Ard Biesheuvel [ardbiesheuvel] -R: Sami Mujawar [samimujawar] - -ArmPlatformPkg -F: ArmPlatformPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ArmPlatformPkg -M: Leif Lindholm [leiflindholm] -M: Ard Biesheuvel [ardbiesheuvel] - -ArmVirtPkg -F: ArmVirtPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ArmVirtPkg -M: Ard Biesheuvel [ardbiesheuvel] -R: Leif Lindholm [leiflindholm] -R: Sami Mujawar [samimujawar] -R: Gerd Hoffmann [kraxel] - -BaseTools -F: BaseTools/ -W: https://github.com/tianocore/tianocore.github.io/wiki/BaseTools -M: Rebecca Cran [bcran] -M: Liming Gao [lgao4] -R: Bob Feng [BobCF] -R: Yuwei Chen [YuweiChen1110] - -BaseTools: Plugins -F: BaseTools/Plugin/ -M: Sean Brogan [spbrogan] -M: Joey Vagedes [javagedes] -R: Michael D Kinney [mdkinney] -R: Liming Gao [lgao4] - CryptoPkg F: CryptoPkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/CryptoPkg -M: Jiewen Yao [jyao1] -M: Yi Li [liyi77] -R: Wenxing Hou [Wenxing-hou] - -DynamicTablesPkg -F: DynamicTablesPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/DynamicTablesPkg -M: Sami Mujawar [samimujawar] -M: Pierre Gondois [pierregondois] - -EmbeddedPkg -F: EmbeddedPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/EmbeddedPkg -M: Leif Lindholm [leiflindholm] -M: Ard Biesheuvel [ardbiesheuvel] -M: Abner Chang [changab] - -EmulatorPkg -F: EmulatorPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/EmulatorPkg -M: Andrew Fish [ajfish] -M: Ray Ni [niruiyu] -S: Maintained - -EmulatorPkg: Redfish-related modules -F: EmulatorPkg/*Redfish* -M: Abner Chang [changab] -M: Nickle Wang [nicklela] - -FatPkg -F: FatPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/Edk2-fat-driver -M: Ray Ni [niruiyu] -T: svn - https://svn.code.sf.net/p/edk2-fatdriver2/code/trunk/EnhancedFat -T: git - https://github.com/tianocore/edk2-FatPkg.git - -FmpDevicePkg -F: FmpDevicePkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/FmpDevicePkg -M: Liming Gao [lgao4] -M: Michael D Kinney [mdkinney] -R: Wei6 Xu [xuweiintel] - -IntelFsp2Pkg -F: IntelFsp2Pkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/IntelFsp2Pkg -M: Chasel Chiu [ChaselChiu] -M: Nate DeSimone [nate-desimone] -M: Duggapu Chinni B [cbduggap] -R: Star Zeng [lzeng14] -R: Ted Kuo [tedkuo1] -R: Ashraf Ali S [AshrafAliS] -R: Susovan Mohapatra [susovanmohapatra] - -IntelFsp2WrapperPkg -F: IntelFsp2WrapperPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/IntelFsp2WrapperPkg -M: Chasel Chiu [ChaselChiu] -M: Nate DeSimone [nate-desimone] -M: Duggapu Chinni B [cbduggap] -M: Chen Gang C [chengangc] -R: Star Zeng [lzeng14] -R: Ted Kuo [tedkuo1] -R: Ashraf Ali S [AshrafAliS] -R: Susovan Mohapatra [susovanmohapatra] +M: Project Mu UEFI Bot [uefibot] +M: Project Mu Bot [ProjectMuBot] +R: Michael Kubacki [makubacki] MdeModulePkg F: MdeModulePkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/MdeModulePkg -M: Liming Gao [lgao4] - -MdeModulePkg: ACPI modules -F: MdeModulePkg/Include/*Acpi*.h -F: MdeModulePkg/Universal/Acpi/ -R: Zhiguang Liu [LiuZhiguang001] -R: Dandan Bi [dandanbi] -R: Liming Gao [lgao4] - -MdeModulePkg: BDS modules -F: MdeModulePkg/*BootManager*/ -F: MdeModulePkg/Include/Library/UefiBootManagerLib.h -F: MdeModulePkg/Universal/BdsDxe/ -F: MdeModulePkg/Universal/DevicePathDxe/ -F: MdeModulePkg/Universal/DriverHealthManagerDxe/ -F: MdeModulePkg/Universal/LoadFileOnFv2/ -F: MdeModulePkg/Universal/SecurityStubDxe/Defer3rdPartyImageLoad.* -R: Zhichao Gao [ZhichaoGao] -R: Ray Ni [niruiyu] - -MdeModulePkg: Console and Graphics modules -F: MdeModulePkg/*Logo*/ -F: MdeModulePkg/Include/*Logo*.h -F: MdeModulePkg/Include/Guid/ConnectConInEvent.h -F: MdeModulePkg/Include/Guid/Console*.h -F: MdeModulePkg/Include/Guid/StandardErrorDevice.h -F: MdeModulePkg/Include/Guid/TtyTerm.h -F: MdeModulePkg/Include/Library/BmpSupportLib.h -F: MdeModulePkg/Include/Library/FrameBufferBltLib.h -F: MdeModulePkg/Library/BaseBmpSupportLib/ -F: MdeModulePkg/Library/FrameBufferBltLib/ -F: MdeModulePkg/Universal/Console/ -R: Zhichao Gao [ZhichaoGao] - -MdeModulePkg: Core services (PEI, DXE and Runtime) modules -F: MdeModulePkg/*Mem*/ -F: MdeModulePkg/*SectionExtract*/ -F: MdeModulePkg/*StatusCode*/ -F: MdeModulePkg/Application/DumpDynPcd/ -F: MdeModulePkg/Core/Dxe/ -F: MdeModulePkg/Core/DxeIplPeim/ -F: MdeModulePkg/Core/RuntimeDxe/ -F: MdeModulePkg/Include/*Mem*.h -F: MdeModulePkg/Include/*Pcd*.h -F: MdeModulePkg/Include/*Perf*.h -F: MdeModulePkg/Include/*StatusCode*.h -F: MdeModulePkg/Include/Guid/Crc32GuidedSectionExtraction.h -F: MdeModulePkg/Include/Guid/EventExitBootServiceFailed.h -F: MdeModulePkg/Include/Guid/IdleLoopEvent.h -F: MdeModulePkg/Include/Guid/LoadModuleAtFixedAddress.h -F: MdeModulePkg/Include/Guid/LzmaDecompress.h -F: MdeModulePkg/Include/Library/SecurityManagementLib.h -F: MdeModulePkg/Library/*Decompress*/ -F: MdeModulePkg/Library/*Perf*/ -F: MdeModulePkg/Library/DxeSecurityManagementLib/ -F: MdeModulePkg/Universal/PCD/ -F: MdeModulePkg/Universal/PlatformDriOverrideDxe/ -F: MdeModulePkg/Universal/SecurityStubDxe/SecurityStub.c -R: Liming Gao [lgao4] - -MdeModulePkg: Device and Peripheral modules -F: MdeModulePkg/*PciHostBridge*/ -F: MdeModulePkg/Bus/ -F: MdeModulePkg/Include/*Ata*.h -F: MdeModulePkg/Include/*IoMmu*.h -F: MdeModulePkg/Include/*NonDiscoverableDevice*.h -F: MdeModulePkg/Include/*NvmExpress*.h -F: MdeModulePkg/Include/*SdMmc*.h -F: MdeModulePkg/Include/*Ufs*.h -F: MdeModulePkg/Include/*Usb*.h -F: MdeModulePkg/Include/Guid/RecoveryDevice.h -F: MdeModulePkg/Include/Guid/S3StorageDeviceInitList.h -F: MdeModulePkg/Include/Library/PciHostBridgeLib.h -F: MdeModulePkg/Include/Ppi/StorageSecurityCommand.h -F: MdeModulePkg/Include/Protocol/Ps2Policy.h -F: MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/ -F: MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/ -R: Ray Ni [niruiyu] - -MdeModulePkg: Disk modules -F: MdeModulePkg/Universal/Disk/ -R: Ray Ni [niruiyu] -R: Zhichao Gao [ZhichaoGao] - -MdeModulePkg: Firmware Update modules -F: MdeModulePkg/*Capsule*/ -F: MdeModulePkg/Include/*Capsule*.h -F: MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h -F: MdeModulePkg/Include/Library/FmpAuthenticationLib.h -F: MdeModulePkg/Include/Protocol/EsrtManagement.h -F: MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h -F: MdeModulePkg/Library/DisplayUpdateProgressLib*/ -F: MdeModulePkg/Library/FmpAuthenticationLibNull/ -F: MdeModulePkg/Universal/Esrt*/ -R: Liming Gao [lgao4] - -MdeModulePkg: HII and UI modules -F: MdeModulePkg/*FileExplorer*/ -F: MdeModulePkg/*Hii*/ -F: MdeModulePkg/*Ui*/ -F: MdeModulePkg/Application/BootManagerMenuApp/ -F: MdeModulePkg/Include/*FileExplorer*.h -F: MdeModulePkg/Include/*FormBrowser*.h -F: MdeModulePkg/Include/*Hii*.h -F: MdeModulePkg/Include/Library/CustomizedDisplayLib.h -F: MdeModulePkg/Include/Protocol/DisplayProtocol.h -F: MdeModulePkg/Library/CustomizedDisplayLib/ -F: MdeModulePkg/Universal/DisplayEngineDxe/ -F: MdeModulePkg/Universal/DriverSampleDxe/ -F: MdeModulePkg/Universal/SetupBrowserDxe/ -R: Dandan Bi [dandanbi] - -MdeModulePkg: Management Mode (MM, SMM) modules -F: MdeModulePkg/*Smi*/ -F: MdeModulePkg/*Smm*/ -F: MdeModulePkg/Include/*Smi*.h -F: MdeModulePkg/Include/*Smm*.h -R: Jiaxin Wu [jiaxinwu] -R: Ray Ni [niruiyu] - -MdeModulePkg: Pei Core -F: MdeModulePkg/Core/Pei/ -R: Liming Gao [lgao4] - -MdeModulePkg: Reset modules -F: MdeModulePkg/*Reset*/ -F: MdeModulePkg/Include/*Reset*.h -R: Zhichao Gao [ZhichaoGao] - -MdeModulePkg: Serial modules -F: MdeModulePkg/*Serial*/ -F: MdeModulePkg/Include/*SerialPort*.h -R: Zhichao Gao [ZhichaoGao] - -MdeModulePkg: SMBIOS modules -F: MdeModulePkg/Universal/Smbios*/ -R: Zhiguang Liu [LiuZhiguang001] -R: Dandan Bi [dandanbi] -R: Star Zeng [lzeng14] -R: Zhichao Gao [ZhichaoGao] - -MdeModulePkg: UEFI Variable modules -F: MdeModulePkg/*Var*/ -F: MdeModulePkg/Include/*/*FaultTolerantWrite*.h -F: MdeModulePkg/Include/*/*Var*.h -F: MdeModulePkg/Include/Guid/SystemNvDataGuid.h -F: MdeModulePkg/Include/Protocol/SwapAddressRange.h -F: MdeModulePkg/Universal/FaultTolerantWrite*/ -R: Liming Gao [lgao4] - -MdeModulePkg: Universal Payload definitions -F: MdeModulePkg/Include/UniversalPayload/ -R: Zhiguang Liu [LiuZhiguang001] -R: Gua Guo [gguo11837463] - -MdeModulePkg: Trace Hub debug message related library instance -F: MdeModulePkg/Library/TraceHubDebugSysTLib/ -F: MdeModulePkg/Include/Guid/TraceHubDebugInfoHob.h -M: Gua Guo [gguo11837463] -M: Prakashan Krishnadas Veliyathuparambil [kprakas2] -R: K N Karthik [karthikkabbigere1] - -MdeModulePkg: USB Network modules -F: MdeModulePkg/Bus/Usb/UsbNetwork -F: MdeModulePkg/Include/Protocol/UsbEthernetProtocol.h -M: Richard Ho [richardho] -R: Rebecca Cran [bcran] - -MdeModulePkg: Manageability modules -F: MdeModulePkg/Include/*Ipmi*.* -F: MdeModulePkg/Library/*Ipmi*.* -M: Abner Chang [changab] -R: Abdul Lateef Attar [abdattar] -R: Nickle Wang [nicklela] - -MdeModulePkg: SPI driver stack -F: MdeModulePkg/Bus/Spi/ -M: Abner Chang [changab] -R: Brit Chesley [BritChesley] - -MdePkg -F: MdePkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/MdePkg -M: Michael D Kinney [mdkinney] -M: Liming Gao [lgao4] -R: Zhiguang Liu [LiuZhiguang001] - -MdePkg: Trace Hub debug message related library instance -F: MdePkg/Library/TraceHubDebugSysTLibNull/ -F: MdePkg/Library/MipiSysTLib/ -F: MdePkg/Include/Library/TraceHubDebugSysTLib.h -F: MdePkg/Include/Library/MipiSysTLib.h -M: Gua Guo [gguo11837463] -M: Prakashan Krishnadas Veliyathuparambil [kprakas2] -R: Chan Laura [lauracha] -R: K N Karthik [karthikkabbigere1] - -MdePkg: FDT related library instance -F: MdePkg/Library/BaseFdtLib/FdtLib.c -F: MdePkg/Include/Library/FdtLib.h -M: Benny Lin [Benny3345678] -R: Gua Guo [gguo11837463] -R: Chasel Chiu [ChaselChiu] -R: James Lu [jameslu8] - -MdePkg: Manageability industryStandard standard C header files -F: MdePkg/Include/IndustryStandard/*Ipmi*.h -F: MdePkg/Include/IndustryStandard/*Mctp*.h -F: MdePkg/Include/IndustryStandard/*Pldm*.h -M: Abner Chang [changab] -R: Abdul Lateef Attar [abdattar] -R: Nickle Wang [nicklela] - -MdePkg: SPI related C header files -F: MdePkg/Include/Protocol/Spi*.h -F: MdePkg/Include/IndustryStandard/SpiNorFlashJedecSfdp.h -M: Abner Chang [changab] -R: Brit Chesley [BritChesley] - -MdePkg: ARM/AARCH64 standard interfaces -F: MdePkg/Include/Library/ArmLib.h -M: Leif Lindholm [leiflindholm] -M: Ard Biesheuvel [ardbiesheuvel] -R: Sami Mujawar [samimujawar] - -NetworkPkg -F: NetworkPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/NetworkPkg -R: Saloni Kasbekar [SaloniKasbekar] -R: Zachary Clark-williams [Zclarkwilliams] - -OvmfPkg -F: OvmfPkg/ -W: http://www.tianocore.org/ovmf/ -M: Ard Biesheuvel [ardbiesheuvel] -M: Jiewen Yao [jyao1] -R: Gerd Hoffmann [kraxel] -S: Maintained - -OvmfPkg: bhyve-related modules -F: OvmfPkg/Bhyve/ -F: OvmfPkg/Include/IndustryStandard/Bhyve.h -F: OvmfPkg/Include/Library/BhyveFwCtlLib.h -F: OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLibBhyve.c -F: OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLibBhyve.inf -F: OvmfPkg/Library/BhyveFwCtlLib/ -F: OvmfPkg/Library/PciHostBridgeLibScan/ -F: OvmfPkg/Library/PlatformBootManagerLibBhyve/ -F: OvmfPkg/Library/ResetSystemLib/BaseResetShutdownBhyve.c -F: OvmfPkg/Library/ResetSystemLib/BaseResetSystemLibBhyve.inf -R: Rebecca Cran [bcran] -R: Corvin Köhne [corvink] - -OvmfPkg: cloudhv-related modules -F: OvmfPkg/CloudHv/ -F: OvmfPkg/Include/IndustryStandard/CloudHv.h -R: Jianyong Wu [jongwu] -R: Anatol Belski [weltling] - -OvmfPkg: microvm-related modules -F: OvmfPkg/Microvm/ -F: OvmfPkg/Include/IndustryStandard/Microvm.h -F: OvmfPkg/Library/ResetSystemLib/*Microvm.* -R: Gerd Hoffmann [kraxel] - -OvmfPkg: Confidential Computing -F: OvmfPkg/AmdSev/ -F: OvmfPkg/AmdSevDxe/ -F: OvmfPkg/Include/Guid/ConfidentialComputingSecret.h -F: OvmfPkg/Include/Library/MemEncryptSevLib.h -F: OvmfPkg/IoMmuDxe/CcIoMmu.* -F: OvmfPkg/Library/BaseMemEncryptSevLib/ -F: OvmfPkg/Library/CcExitLib/ -F: OvmfPkg/PlatformPei/AmdSev.c -F: OvmfPkg/ResetVector/ -F: OvmfPkg/Sec/ -R: Erdem Aktas [ruleof2] -R: Jiewen Yao [jyao1] -R: Min Xu [mxu9] -R: Tom Lendacky [tlendacky] -R: Michael Roth [mdroth] - -OvmfPkg: FDT related modules -F: OvmfPkg/Fdt -R: Leif Lindholm [leiflindholm] -R: Gerd Hoffmann [kraxel] -R: Abner Chang [changab] - -OvmfPkg: LsiScsi driver -F: OvmfPkg/LsiScsiDxe/ -R: Gary Lin [lcp] - -OvmfPkg: MptScsi and PVSCSI driver -F: OvmfPkg/MptScsiDxe/ -F: OvmfPkg/PvScsiDxe/ -R: Aaron Young [ajyoung-oracle] - -OvmfPkg: TCG- and TPM2-related modules -F: OvmfPkg/Include/IndustryStandard/QemuTpm.h -F: OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c -F: OvmfPkg/Library/Tcg2PhysicalPresenceLib*/ -F: OvmfPkg/PlatformPei/ClearCache.c -F: OvmfPkg/Tcg/ -R: Marc-André Lureau [elmarco] - -OvmfPkg: Xen-related modules -F: OvmfPkg/Include/Guid/XenBusRootDevice.h -F: OvmfPkg/Include/Guid/XenInfo.h -F: OvmfPkg/Include/IndustryStandard/Xen/ -F: OvmfPkg/Include/Library/XenHypercallLib.h -F: OvmfPkg/Include/Library/XenIoMmioLib.h -F: OvmfPkg/Include/Library/XenPlatformLib.h -F: OvmfPkg/Include/Protocol/XenBus.h -F: OvmfPkg/Include/Protocol/XenIo.h -F: OvmfPkg/Library/PciHostBridgeLibScan/ -F: OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c -F: OvmfPkg/Library/XenConsoleSerialPortLib/ -F: OvmfPkg/Library/XenHypercallLib/ -F: OvmfPkg/Library/XenIoMmioLib/ -F: OvmfPkg/Library/XenPlatformLib/ -F: OvmfPkg/Library/XenRealTimeClockLib/ -F: OvmfPkg/OvmfXen.* -F: OvmfPkg/OvmfXenElfHeaderGenerator.c -F: OvmfPkg/SmbiosPlatformDxe/*Xen* -F: OvmfPkg/XenAcpiPlatformDxe/ -F: OvmfPkg/XenBusDxe/ -F: OvmfPkg/XenIoPciDxe/ -F: OvmfPkg/XenIoPvhDxe/ -F: OvmfPkg/XenPlatformPei/ -F: OvmfPkg/XenPvBlkDxe/ -F: OvmfPkg/XenResetVector/ -R: Anthony Perard [tperard] - -OvmfPkg: RISC-V Qemu Virt Platform -F: OvmfPkg/RiscVVirt -M: Sunil V L [vlsunil] -R: Andrei Warkentin [andreiw] - -OvmfPkg: LOONGARCH Qemu Virt Platform -F: OvmfPkg/LoongArchVirt -M: Chao Li [kilaterlee] -M: Bibo Mao [bibo-mao] -R: Xianglai Li [lixianglai] - -PcAtChipsetPkg -F: PcAtChipsetPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/PcAtChipsetPkg -M: Ray Ni [niruiyu] +M: Project Mu UEFI Bot [uefibot] PrmPkg F: PrmPkg/ M: Michael Kubacki [makubacki] -M: Nate DeSimone [nate-desimone] - -PrmPkg: ACPI related modules -R: Ankit Sinha [ankit13s] - -RedfishPkg: Redfish related modules -F: RedfishPkg/ -M: Abner Chang [changab] -M: Nickle Wang [nicklela] -R: Igor Kulchytskyy [igorkulchytskyy] - -SecurityPkg -F: SecurityPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/SecurityPkg -M: Jiewen Yao [jyao1] - -SecurityPkg: Secure boot related modules -F: SecurityPkg/Library/DxeImageVerificationLib/ -F: SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/ -F: SecurityPkg/Library/AuthVariableLib/ -R: Min Xu [mxu9] - -SecurityPkg: Tcg related modules -F: SecurityPkg/Tcg/ -R: Rahul Kumar [rahul1-kumar] - -ShellPkg -F: ShellPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ShellPkg -M: Zhichao Gao [ZhichaoGao] - -SignedCapsulePkg -F: SignedCapsulePkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/SignedCapsulePkg - -SourceLevelDebugPkg -F: SourceLevelDebugPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/SourceLevelDebugPkg - -StandaloneMmPkg -F: StandaloneMmPkg/ -M: Ard Biesheuvel [ardbiesheuvel] -M: Sami Mujawar [samimujawar] -M: Ray Ni [niruiyu] -R: Jiaxin Wu [jiaxinwu] UefiCpuPkg F: UefiCpuPkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/UefiCpuPkg -M: Ray Ni [niruiyu] -R: Rahul Kumar [rahul1-kumar] -R: Gerd Hoffmann [kraxel] -R: Jiaxin Wu [jiaxinwu] - -UefiCpuPkg: Sec related modules -F: UefiCpuPkg/SecCore/ -F: UefiCpuPkg/ResetVector/ -R: Catharine West [catharine-intl] - -UefiCpuPkg: AMD related files -F: UefiCpuPkg/Library/MmSaveStateLib/*Amd*.* -F: UefiCpuPkg/Library/SmmCpuFeaturesLib/*Amd*.* -M: Abdul Lateef Attar [abdattar] -R: Abner Chang [changab] - -UefiPayloadPkg -F: UefiPayloadPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/UefiPayloadPkg -M: Guo Dong [gdong1] -M: Sean Rhodes [Sean-StarLabs] -M: James Lu [jameslu8] -R: Gua Guo [gguo11837463] -S: Maintained - -UnitTestFrameworkPkg -F: UnitTestFrameworkPkg/ -M: Michael D Kinney [mdkinney] -M: Michael Kubacki [makubacki] +M: Project Mu UEFI Bot [uefibot] +R: Project Mu Bot [ProjectMuBot] R: Sean Brogan [spbrogan] -S: Maintained +R: Joey Vagedes [javagedes] diff --git a/pip-requirements.txt b/pip-requirements.txt index e07b9cac52c5..adc0075ccf4f 100644 --- a/pip-requirements.txt +++ b/pip-requirements.txt @@ -16,5 +16,5 @@ edk2-pytool-library==0.21.8 edk2-pytool-extensions==0.27.6 edk2-basetools==0.1.51 antlr4-python3-runtime==4.7.1 -lcov-cobertura==2.0.2 +lcov-cobertura==2.1.1 regex==2024.5.15