228
228
def _api_request(self, method, path, body=None):
230
'Content-Type': 'application/json',
230
231
'Accept': 'application/vnd.github.v3+json'}
232
233
headers['Authorization'] = 'token %s' % self._token
262
263
return json.loads(response.text)
263
264
raise InvalidHttpResponse(path, response.text)
265
def _create_pull(self, path, title, head, base, body=None):
266
def _create_pull(self, path, title, head, base, body=None, labels=None, assignee=None):
272
if labels is not None:
273
data['labels'] = labels
274
if assignee is not None:
275
data['assignee'] = assignee
272
277
data['body'] = body
274
279
response = self._api_request(
275
280
'POST', path, body=json.dumps(data).encode('utf-8'))
276
281
if response.status != 201:
277
raise InvalidHttpResponse(path, response.text)
282
raise InvalidHttpResponse(path, 'req is invalid %d %r: %r' % (response.status, data, response.text))
278
283
return json.loads(response.text)
280
285
def _get_user_by_email(self, email):
292
297
def _get_user(self, username=None):
294
path = 'users/:%s' % username
299
path = 'users/%s' % username
297
302
response = self._api_request('GET', path)
300
305
return json.loads(response.text)
302
307
def _get_organization(self, name):
303
path = 'orgs/:%s' % name
308
path = 'orgs/%s' % name
304
309
response = self._api_request('GET', path)
305
310
if response.status != 200:
306
311
raise InvalidHttpResponse(path, response.text)
522
527
# TODO(jelmer): Set maintainers_can_modify?
523
528
target_repo = self.gh._get_repo(
524
529
self.target_owner, self.target_repo_name)
526
pull_request = self.gh._create_pull(
527
strip_optional(target_repo['pulls_url']),
528
title=title, body=description,
529
head="%s:%s" % (self.source_owner, self.source_branch_name),
530
base=self.target_branch_name)
531
except ValidationFailed:
532
raise MergeProposalExists(self.source_branch.user_url)
535
533
for reviewer in reviewers:
536
534
if '@' in reviewer:
537
535
user = self.gh._get_user_by_email(reviewer)
539
537
user = self.gh._get_user(reviewer)
540
538
assignees.append(user['login'])
541
if labels or assignees:
544
data['labels'] = labels
546
data['assignees'] = assignees
547
response = self.gh._api_request(
548
'PATCH', pull_request['issue_url'], body=json.dumps(data).encode('utf-8'))
549
if response.status == 422:
550
raise ValidationFailed(json.loads(response.text))
551
if response.status != 200:
552
raise InvalidHttpResponse(pull_request['issue_url'], response.text)
542
pull_request = self.gh._create_pull(
543
strip_optional(target_repo['pulls_url']),
544
title=title, body=description,
545
head="%s:%s" % (self.source_owner, self.source_branch_name),
546
base=self.target_branch_name,
547
labels=labels, assignee=assignees)
548
except ValidationFailed:
549
raise MergeProposalExists(self.source_branch.user_url)
553
550
return GitHubMergeProposal(self.gh, pull_request)