/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/plugins/propose/gitlabs.py

  • Committer: Jelmer Vernooij
  • Date: 2019-08-11 13:21:03 UTC
  • mfrom: (7379 work)
  • mto: This revision was merged to the branch mainline in revision 7388.
  • Revision ID: jelmer@jelmer.uk-20190811132103-u3ne03yf37c1h57n
merge trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
123
123
        yield name, section
124
124
 
125
125
 
 
126
def get_credentials_by_url(url):
 
127
    for name, credentials in iter_tokens():
 
128
        if 'url' not in credentials:
 
129
            continue
 
130
        if credentials['url'].rstrip('/') == url.rstrip('/'):
 
131
            return credentials
 
132
    else:
 
133
        return None
 
134
 
 
135
 
126
136
def parse_gitlab_url(url):
127
137
    (scheme, user, password, host, port, path) = urlutils.parse_url(
128
138
        url)
220
230
    def base_url(self):
221
231
        return self.transport.base
222
232
 
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)
227
237
 
228
238
    def __init__(self, transport, private_token):
229
239
        self.transport = transport
231
241
        self.check()
232
242
 
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)
241
251
 
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)
245
 
        if response != 200:
246
 
            raise InvalidHttpResponse(path, response.text)
 
255
        if response != 201:
 
256
            raise errors.InvalidHttpResponse(path, response.text)
247
257
        return json.loads(response.data)
248
258
 
249
259
    def _get_logged_in_username(self):
251
261
 
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), '')
255
265
        else:
256
266
            path = 'merge_requests'
257
267
        parameters = {}
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)
270
280
 
271
281
    def _create_mergerequest(
272
282
            self, title, source_project_id, target_project_id,
273
283
            source_branch_name, target_branch_name, description,
274
284
            labels=None):
275
 
        path = 'projects/:%s/merge_requests' % source_project_id
 
285
        path = 'projects/%s/merge_requests' % source_project_id
 
286
        fields = {
 
287
            'title': title,
 
288
            'source_branch': source_branch_name,
 
289
            'target_branch': target_branch_name,
 
290
            'target_project_id': target_project_id,
 
291
            'description': description,
 
292
            }
 
293
        if labels:
 
294
            fields['labels'] = labels
276
295
        response = self._api_request(
277
 
            'POST', path, fields={
278
 
                'title': title,
279
 
                'source_branch': source_branch_name,
280
 
                'target_branch': target_branch_name,
281
 
                'target_project_id': target_project_id,
282
 
                'description': description,
283
 
                'labels': labels})
 
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)
291
304
 
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)
391
407
 
392
408
    @classmethod
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):
414
430
                raise
415
431
            else:
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)
422
438
 
423
439
 
424
440
class GitlabMergeProposalBuilder(MergeProposalBuilder):
425
441
 
426
 
    def __init__(self, l, source_branch, target_branch):
 
442
    def __init__(self, gl, source_branch, target_branch):
427
443
        self.gl = gl
428
444
        self.source_branch = source_branch
429
445
        (self.source_host, self.source_project_name, self.source_branch_name) = (
468
484
            'title': title,
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}
474
490
        if labels:
475
491
            kwargs['labels'] = ','.join(labels)