123
123
yield name, section
126
def get_credentials_by_url(url):
127
for name, credentials in iter_tokens():
128
if 'url' not in credentials:
130
if credentials['url'].rstrip('/') == url.rstrip('/'):
126
136
def parse_gitlab_url(url):
127
137
(scheme, user, password, host, port, path) = urlutils.parse_url(
220
230
def base_url(self):
221
231
return self.transport.base
223
def _api_request(self, method, path):
233
def _api_request(self, method, path, data=None):
224
234
return self.transport.request(
225
235
method, urlutils.join(self.base_url, 'api', 'v4', path),
226
headers=self.headers)
236
headers=self.headers, body=data)
228
238
def __init__(self, transport, private_token):
229
239
self.transport = transport
233
243
def _get_project(self, project_name):
234
path = 'projects/:%s' % urlutils.quote(str(project_name), '')
244
path = 'projects/%s' % urlutils.quote(str(project_name), '')
235
245
response = self._api_request('GET', path)
236
246
if response.status == 404:
237
247
raise NoSuchProject(project_name)
238
248
if response.status == 200:
239
249
return json.loads(response.data)
240
raise InvalidHttpResponse(path, response.text)
250
raise errors.InvalidHttpResponse(path, response.text)
242
252
def _fork_project(self, project_name):
243
path = 'projects/:%s/fork' % urlutils.quote(str(project_name), '')
253
path = 'projects/%s/fork' % urlutils.quote(str(project_name), '')
244
254
response = self._api_request('POST', path)
246
raise InvalidHttpResponse(path, response.text)
256
raise errors.InvalidHttpResponse(path, response.text)
247
257
return json.loads(response.data)
249
259
def _get_logged_in_username(self):
252
262
def _list_merge_requests(self, owner=None, project=None, state=None):
253
263
if project is not None:
254
path = 'projects/:%s/merge_requests' % urlutils.quote(str(project_name), '')
264
path = 'projects/%s/merge_requests' % urlutils.quote(str(project), '')
256
266
path = 'merge_requests'
266
276
raise errors.PermissionDenied(response.text)
267
277
if response.status == 200:
268
278
return json.loads(response.data)
269
raise InvalidHttpResponse(path, response.text)
279
raise errors.InvalidHttpResponse(path, response.text)
271
281
def _create_mergerequest(
272
282
self, title, source_project_id, target_project_id,
273
283
source_branch_name, target_branch_name, description,
275
path = 'projects/:%s/merge_requests' % source_project_id
285
path = 'projects/%s/merge_requests' % source_project_id
288
'source_branch': source_branch_name,
289
'target_branch': target_branch_name,
290
'target_project_id': target_project_id,
291
'description': description,
294
fields['labels'] = labels
276
295
response = self._api_request(
277
'POST', path, fields={
279
'source_branch': source_branch_name,
280
'target_branch': target_branch_name,
281
'target_project_id': target_project_id,
282
'description': description,
296
'POST', path, data=json.dumps(fields).encode('utf-8'))
284
297
if response.status == 403:
285
298
raise errors.PermissionDenied(response.text)
286
299
if response.status == 409:
287
300
raise MergeProposalExists(self.source_branch.user_url)
288
if response.status == 200:
289
raise InvalidHttpResponse(path, response.text)
301
if response.status != 201:
302
raise errors.InvalidHttpResponse(path, response.text)
290
303
return json.loads(response.data)
292
305
def get_push_url(self, branch):
351
364
source_project = self._get_project(source_project_name)
352
365
target_project = self._get_project(target_project_name)
353
366
state = mp_status_to_status(status)
354
for mr in self.gl._list_merge_requests(
367
for mr in self._list_merge_requests(
355
368
project=target_project['id'], state=state):
356
369
if (mr['source_project_id'] != source_project['id'] or
357
370
mr['source_branch'] != source_branch_name or
387
400
raise UnsupportedHoster(url)
388
401
transport = get_transport(
389
402
'https://%s' % host, possible_transports=possible_transports)
390
return cls(transport)
403
credentials = get_credentials_by_url(transport.base)
404
if credentials is not None:
405
return cls(transport, credentials.get('private_token'))
406
raise UnsupportedHoster(url)
393
409
def iter_instances(cls):
410
426
except NotGitLabUrl:
411
427
raise UnsupportedHoster(url)
412
428
except NotMergeRequestUrl as e:
413
if self.gl.url == ('https://%s' % e.host):
429
if self.base_url == ('https://%s' % e.host):
416
432
raise UnsupportedHoster(url)
417
if self.gl.url != ('https://%s' % host):
433
if self.base_url != ('https://%s' % host):
418
434
raise UnsupportedHoster(url)
419
project = self.gl.projects.get(project)
435
project = self._get_project(project)
420
436
mr = project.mergerequests.get(merge_id)
421
437
return GitLabMergeProposal(mr)
424
440
class GitlabMergeProposalBuilder(MergeProposalBuilder):
426
def __init__(self, l, source_branch, target_branch):
442
def __init__(self, gl, source_branch, target_branch):
428
444
self.source_branch = source_branch
429
445
(self.source_host, self.source_project_name, self.source_branch_name) = (
469
485
'source_project_id': source_project['id'],
470
486
'target_project_id': target_project['id'],
471
'source_branch': self.source_branch_name,
472
'target_branch': self.target_branch_name,
487
'source_branch_name': self.source_branch_name,
488
'target_branch_name': self.target_branch_name,
473
489
'description': description}
475
491
kwargs['labels'] = ','.join(labels)