Merge "Optimize GitHub requests on PR merge"

This commit is contained in:
Zuul
2020-10-02 11:12:58 +00:00
committed by Gerrit Code Review
2 changed files with 44 additions and 23 deletions

View File

@@ -518,24 +518,6 @@ class FakePull(object):
# with the head_sha as the only commit # with the head_sha as the only commit
return [self.head] return [self.head]
def merge(self, commit_message=None, sha=None, merge_method=None):
conn = self._fake_pull_request.github
pr = self._fake_pull_request
# record that this got reported
conn.github_data.reports.append(
(pr.project, pr.number, 'merge', merge_method))
if conn.merge_failure:
raise Exception('Unknown merge failure')
if conn.merge_not_allowed_count > 0:
conn.merge_not_allowed_count -= 1
resp = ErrorResponse()
resp.status_code = 403
resp.message = 'Merge not allowed'
raise github3.exceptions.MethodNotAllowed(resp)
pr.setMerged(commit_message)
return True
def as_dict(self): def as_dict(self):
pr = self._fake_pull_request pr = self._fake_pull_request
connection = pr.github connection = pr.github
@@ -669,6 +651,31 @@ class FakeGithubSession(object):
return FakeResponse(None, 404) return FakeResponse(None, 404)
def put(self, url, data=None, headers=None, params=None, json=None):
# Handle pull request merge
match = re.match(r'.+/repos/(.+)/pulls/(\d+)/merge$', url)
if match:
project, pr_number = match.groups()
project = urllib.parse.unquote(project)
pr = self.client._data.pull_requests[int(pr_number)]
conn = pr.github
# record that this got reported
self.client._data.reports.append(
(pr.project, pr.number, 'merge', json["merge_method"]))
if conn.merge_failure:
raise Exception('Unknown merge failure')
if conn.merge_not_allowed_count > 0:
conn.merge_not_allowed_count -= 1
resp = ErrorResponse()
resp.status_code = 403
resp.message = 'Merge not allowed'
raise github3.exceptions.MethodNotAllowed(resp)
pr.setMerged(json["commit_message"])
return FakeResponse({"merged": True}, 200)
return FakeResponse(None, 404)
def get_repo(self, request, params=None): def get_repo(self, request, params=None):
org, project, request = request.split('/', 2) org, project, request = request.split('/', 2)
project_name = '{}/{}'.format(org, project) project_name = '{}/{}'.format(org, project)

View File

@@ -1872,17 +1872,31 @@ class GithubConnection(BaseConnection):
method='merge', zuul_event_id=None): method='merge', zuul_event_id=None):
log = get_annotated_logger(self.log, zuul_event_id) log = get_annotated_logger(self.log, zuul_event_id)
github = self.getGithubClient(project, zuul_event_id=zuul_event_id) github = self.getGithubClient(project, zuul_event_id=zuul_event_id)
owner, proj = project.split('/') url = github.session.build_url("repos", project, "pulls",
pull_request = github.pull_request(owner, proj, pr_number) str(pr_number), "merge")
payload = {
"merge_method": method,
}
if sha:
payload["sha"] = sha
if commit_message:
payload["commit_message"] = commit_message
try: try:
result = pull_request.merge(commit_message=commit_message, sha=sha, resp = github.session.put(url, json=payload)
merge_method=method) resp.raise_for_status()
data = resp.json()
if not data:
result = False
else:
result = data["merged"]
except Exception as e: except Exception as e:
raise MergeFailure('Pull request merge failed: %s' % e) raise MergeFailure('Pull request merge failed: %s' % e)
if not result: if not result:
raise MergeFailure('Pull request was not merged') raise MergeFailure('Pull request was not merged')
log.debug("Merged PR %s/%s#%s", owner, proj, pr_number) log.debug("Merged PR %s#%s", project, pr_number)
def _getCommit(self, repository, sha, retries=5): def _getCommit(self, repository, sha, retries=5):
try: try: