| # Copyright 2023 the V8 project authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from requests.exceptions import HTTPError |
| |
| from blinkpy.w3c.test_exporter import TestExporter |
| from blinkpy.w3c.wpt_github import GitHubError |
| |
| import logging |
| |
| _log = logging.getLogger(__name__) |
| |
| PR_APPROVAL_LOGIN = 'test262-merge-bot' |
| |
| |
| class BaseV8TestExporter(TestExporter): |
| |
| def export_in_flight_changes(self, pr_events) -> bool: |
| """Test262 exporter ignores in-flight changes.""" |
| pass |
| |
| |
| class V8TestExporter(BaseV8TestExporter): |
| |
| def merge_pull_request(self, pull_request): |
| """Exporter mode does not merge any PRs. We only create them.""" |
| pass |
| |
| |
| class V8TestApprover(BaseV8TestExporter): |
| |
| def merge_pull_request(self, pull_request): |
| """Merges a pull request only if in approver mode.""" |
| self.approve(pull_request.number) |
| super().merge_pull_request(pull_request) |
| |
| def approve(self, pr_number): |
| """Approves a PR. |
| Chromium/WPT exports are self approved via a web hook with self |
| approve functionality from an external github project |
| (https://github.com/web-platform-tests/wpt-pr-bot). |
| |
| We will mimic the same behavior by sending an approve request just |
| before we attempt a second pass merge. |
| """ |
| if not self.is_approvable(pr_number): |
| return |
| |
| body = { |
| 'body': ('The review process for this patch is being conducted in ' |
| 'the V8 project.'), |
| 'event': 'APPROVE', |
| 'comments': [], |
| } |
| |
| try: |
| response = self.github.request( |
| self.pr_path(pr_number), method='POST', body=body) |
| except HTTPError as e: |
| response = e.response |
| _log.error('Failed to approve PR %d: %s', pr_number, response.text) |
| |
| def pr_path(self, pr_number): |
| return (f'/repos/{self.github.gh_org}/{self.github.gh_repo_name}' |
| f'/pulls/{pr_number}/reviews') |
| |
| def is_approvable(self, pr_number): |
| """Validates approval requirements.""" |
| try: |
| response = self.github.request(self.pr_path(pr_number), method='GET') |
| reviews = response.data |
| reviewed_by_bot = any( |
| review['user']['login'] == PR_APPROVAL_LOGIN for review in reviews) |
| if reviewed_by_bot: |
| _log.info('PR %d already approved by us', pr_number) |
| return False |
| except HTTPError as e: |
| response = e.response |
| _log.error('Failed to get PR %d: %s', pr_number, response.text) |
| return False |
| return True |
| |
| def create_or_update_pr_from_landed_commit(self, commit): |
| """Approver mode does not create any PRs""" |
| pass |