Files
Kmake/deps/v8/test/test262/tools/v8_exporter.py
2026-05-26 23:36:42 -07:00

87 lines
2.6 KiB
Python

# 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