130
131
def get_commit_message(self):
134
def set_commit_message(self, message):
135
self._patch({'title': message})
137
def _patch(self, data):
138
response = self._gh._api_request(
139
'PATCH', self._pr['url'], body=json.dumps(data).encode('utf-8'))
141
raise InvalidHttpResponse(self._pr['url'], response.text)
142
self._pr = json.loads(response.text)
133
144
def set_description(self, description):
134
self._pr.edit(body=description, title=determine_title(description))
147
'title': determine_title(description),
136
150
def is_merged(self):
137
return self._pr['merged']
151
return self._pr['state'] == 'merged'
140
self._pr.edit(state='closed')
154
self._patch({'state': 'closed'})
142
156
def merge(self, commit_message=None):
143
157
# https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button
178
192
def __repr__(self):
179
193
return "GitHub()"
181
def _api_request(self, method, path):
195
def _api_request(self, method, path, body=None):
183
197
'Accept': 'application/vnd.github.v3+json'}
185
199
headers['Authorization'] = 'token %s' % self._token
186
200
response = self.transport.request(
187
201
method, urlutils.join(self.transport.base, path),
202
headers=headers, body=body)
189
203
if response.status == 401:
190
204
raise GitHubLoginRequired(self)
199
213
return json.loads(response.text)
200
214
raise InvalidHttpResponse(path, response.text)
216
def _get_repo_pulls(self, path, head=None, state=None):
217
path = 'repos/' + path + '/pulls?'
220
params['head'] = head
221
if state is not None:
222
params['state'] = state
223
path += ';'.join(['%s=%s' % (k, urlutils.quote(v))
224
for k, v in params.items()])
225
response = self._api_request('GET', path)
226
if response.status == 404:
227
raise NoSuchProject(path)
228
if response.status == 200:
229
return json.loads(response.text)
230
raise InvalidHttpResponse(path, response.text)
202
232
def _get_user(self, username=None):
204
234
path = 'users/:%s' % username
304
334
parse_github_branch_url(source_branch))
305
335
(target_owner, target_repo_name, target_branch_name) = (
306
336
parse_github_branch_url(target_branch))
307
target_repo = self._get_repo(
308
"%s/%s" % (target_owner, target_repo_name))
337
target_repo_path = "%s/%s" % (target_owner, target_repo_name)
338
target_repo = self._get_repo(target_repo_path)
311
341
'merged': 'closed',
312
342
'closed': 'closed',
314
for pull in target_repo.get_pulls(
315
head=target_branch_name,
316
state=state[status]):
317
if (status == 'closed' and pull.merged or
318
status == 'merged' and not pull.merged):
320
if pull.head.ref != source_branch_name:
322
if pull.head.repo is None:
344
pulls = self._get_repo_pulls(
346
head=target_branch_name,
349
if (status == 'closed' and pull['merged'] or
350
status == 'merged' and not pull['merged']):
352
if pull['head']['ref'] != source_branch_name:
354
if pull['head']['repo'] is None:
323
355
# Repo has gone the way of the dodo
325
if (pull.head.repo.owner.login != source_owner or
326
pull.head.repo.name != source_repo_name):
357
if (pull['head']['repo']['owner']['login'] != source_owner or
358
pull['head']['repo']['name'] != source_repo_name):
328
yield GitHubMergeProposal(pull)
360
yield GitHubMergeProposal(self, pull)
330
362
def hosts(self, branch):
366
398
response = self._api_request('GET', url)
367
399
if response.status != 200:
368
400
raise InvalidHttpResponse(url, response.text)
369
yield GitHubMergeProposal(json.loads(response.text))
401
yield GitHubMergeProposal(self, json.loads(response.text))
371
403
def get_proposal_by_url(self, url):
372
404
raise UnsupportedHoster(url)