forked from LeenkxTeam/Kmake
87 lines
2.6 KiB
Python
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
|