Merge "Optimize GitHub requests on PR merge"
This commit is contained in:
commit
212ed78502
|
@ -518,24 +518,6 @@ class FakePull(object):
|
|||
# with the head_sha as the only commit
|
||||
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):
|
||||
pr = self._fake_pull_request
|
||||
connection = pr.github
|
||||
|
@ -669,6 +651,31 @@ class FakeGithubSession(object):
|
|||
|
||||
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):
|
||||
org, project, request = request.split('/', 2)
|
||||
project_name = '{}/{}'.format(org, project)
|
||||
|
|
|
@ -1872,17 +1872,31 @@ class GithubConnection(BaseConnection):
|
|||
method='merge', zuul_event_id=None):
|
||||
log = get_annotated_logger(self.log, zuul_event_id)
|
||||
github = self.getGithubClient(project, zuul_event_id=zuul_event_id)
|
||||
owner, proj = project.split('/')
|
||||
pull_request = github.pull_request(owner, proj, pr_number)
|
||||
url = github.session.build_url("repos", project, "pulls",
|
||||
str(pr_number), "merge")
|
||||
|
||||
payload = {
|
||||
"merge_method": method,
|
||||
}
|
||||
if sha:
|
||||
payload["sha"] = sha
|
||||
if commit_message:
|
||||
payload["commit_message"] = commit_message
|
||||
|
||||
try:
|
||||
result = pull_request.merge(commit_message=commit_message, sha=sha,
|
||||
merge_method=method)
|
||||
resp = github.session.put(url, json=payload)
|
||||
resp.raise_for_status()
|
||||
data = resp.json()
|
||||
if not data:
|
||||
result = False
|
||||
else:
|
||||
result = data["merged"]
|
||||
except Exception as e:
|
||||
raise MergeFailure('Pull request merge failed: %s' % e)
|
||||
|
||||
if not result:
|
||||
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):
|
||||
try:
|
||||
|
|
Loading…
Reference in New Issue