/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/github/hoster.py

  • Committer: Jelmer Vernooij
  • Date: 2020-08-05 20:34:11 UTC
  • mfrom: (7490.40.87 work)
  • mto: (7490.40.103 work)
  • mto: This revision was merged to the branch mainline in revision 7521.
  • Revision ID: jelmer@jelmer.uk-20200805203411-cap9gp8vuwnz5lt7
Merge lp:brz/3.1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
44
44
    version_string as breezy_version,
45
45
    )
46
46
from ...config import AuthenticationConfig, GlobalStack
47
 
from ...errors import InvalidHttpResponse, PermissionDenied
 
47
from ...errors import (
 
48
    InvalidHttpResponse,
 
49
    PermissionDenied,
 
50
    UnexpectedHttpStatus,
 
51
    )
48
52
from ...git.urls import git_url_to_bzr_url
49
53
from ...i18n import gettext
50
54
from ...sixish import PY3
123
127
    def __repr__(self):
124
128
        return "<%s at %r>" % (type(self).__name__, self.url)
125
129
 
 
130
    name = 'GitHub'
 
131
 
126
132
    @property
127
133
    def url(self):
128
134
        return self._pr['html_url']
165
171
        if response.status == 422:
166
172
            raise ValidationFailed(json.loads(response.text))
167
173
        if response.status != 200:
168
 
            raise InvalidHttpResponse(self._pr['url'], response.text)
 
174
            raise UnexpectedHttpStatus(self._pr['url'], response.status)
169
175
        self._pr = json.loads(response.text)
170
176
 
171
177
    def set_description(self, description):
202
208
        if response.status == 422:
203
209
            raise ValidationFailed(json.loads(response.text))
204
210
        if response.status != 200:
205
 
            raise InvalidHttpResponse(self._pr['url'], response.text)
 
211
            raise UnexpectedHttpStatus(self._pr['url'], response.status)
206
212
 
207
213
    def get_merged_by(self):
208
214
        merged_by = self._pr.get('merged_by')
224
230
        if response.status == 422:
225
231
            raise ValidationFailed(json.loads(response.text))
226
232
        if response.status != 201:
227
 
            raise InvalidHttpResponse(self._pr['comments_url'], response.text)
 
233
            raise UnexpectedHttpStatus(
 
234
                self._pr['comments_url'], response.status)
228
235
        json.loads(response.text)
229
236
 
230
237
 
273
280
            'Accept': 'application/vnd.github.v3+json'}
274
281
        if self._token:
275
282
            headers['Authorization'] = 'token %s' % self._token
276
 
        response = self.transport.request(
277
 
            method, urlutils.join(self.transport.base, path),
278
 
            headers=headers, body=body, retries=3)
 
283
        try:
 
284
            response = self.transport.request(
 
285
                method, urlutils.join(self.transport.base, path),
 
286
                headers=headers, body=body, retries=3)
 
287
        except UnexpectedHttpStatus as e:
 
288
            if e.code == 401:
 
289
                raise GitHubLoginRequired(self)
 
290
            else:
 
291
                raise
279
292
        if response.status == 401:
280
293
            raise GitHubLoginRequired(self)
281
294
        return response
287
300
            raise NoSuchProject(path)
288
301
        if response.status == 200:
289
302
            return json.loads(response.text)
290
 
        raise InvalidHttpResponse(path, response.text)
 
303
        raise UnexpectedHttpStatus(path, response.status)
291
304
 
292
305
    def _get_repo_pulls(self, path, head=None, state=None):
293
306
        path = path + '?'
303
316
            raise NoSuchProject(path)
304
317
        if response.status == 200:
305
318
            return json.loads(response.text)
306
 
        raise InvalidHttpResponse(path, response.text)
 
319
        raise UnexpectedHttpStatus(path, response.status)
307
320
 
308
321
    def _create_pull(self, path, title, head, base, body=None, labels=None,
309
322
                     assignee=None, draft=False, maintainer_can_modify=False):
326
339
        if response.status == 403:
327
340
            raise PermissionDenied(path, response.text)
328
341
        if response.status != 201:
329
 
            raise InvalidHttpResponse(path, 'req is invalid %d %r: %r' % (response.status, data, response.text))
 
342
            raise UnexpectedHttpStatus(path, response.status)
330
343
        return json.loads(response.text)
331
344
 
332
345
    def _get_user_by_email(self, email):
333
346
        path = 'search/users?q=%s+in:email' % email
334
347
        response = self._api_request('GET', path)
335
348
        if response.status != 200:
336
 
            raise InvalidHttpResponse(path, response.text)
 
349
            raise UnexpectedHttpStatus(path, response.status)
337
350
        ret = json.loads(response.text)
338
351
        if ret['total_count'] == 0:
339
352
            raise KeyError('no user with email %s' % email)
348
361
            path = 'user'
349
362
        response = self._api_request('GET', path)
350
363
        if response.status != 200:
351
 
            raise InvalidHttpResponse(path, response.text)
 
364
            raise UnexpectedHttpStatus(path, response.status)
352
365
        return json.loads(response.text)
353
366
 
354
367
    def _get_organization(self, name):
355
368
        path = 'orgs/%s' % name
356
369
        response = self._api_request('GET', path)
357
370
        if response.status != 200:
358
 
            raise InvalidHttpResponse(path, response.text)
 
371
            raise UnexpectedHttpStatus(path, response.status)
359
372
        return json.loads(response.text)
360
373
 
361
374
    def _list_paged(self, path, parameters=None, per_page=None):
374
387
                ';'.join(['%s=%s' % (k, urlutils.quote(v))
375
388
                          for (k, v) in parameters.items()]))
376
389
            if response.status != 200:
377
 
                raise InvalidHttpResponse(path, response.text)
 
390
                raise UnexpectedHttpStatus(path, response.status)
378
391
            data = json.loads(response.text)
379
392
            for entry in data['items']:
380
393
                i += 1
388
401
        return self._list_paged(path, {'q': query}, per_page=DEFAULT_PER_PAGE)
389
402
 
390
403
    def _create_fork(self, path, owner=None):
391
 
        if owner and owner != self._current_user['login']:
 
404
        if owner and owner != self.current_user['login']:
392
405
            path += '?organization=%s' % owner
393
406
        response = self._api_request('POST', path)
394
407
        if response.status != 202:
395
 
            raise InvalidHttpResponse(path, 'status: %d, %r' % (response.status, response.text))
 
408
            raise UnexpectedHttpStatus(path, response.status)
396
409
        return json.loads(response.text)
397
410
 
398
411
    @property
402
415
    def __init__(self, transport):
403
416
        self._token = retrieve_github_token('https', GITHUB_HOST)
404
417
        self.transport = transport
405
 
        self._current_user = self._get_user()
 
418
        self._current_user = None
 
419
 
 
420
    @property
 
421
    def current_user(self):
 
422
        if self._current_user is None:
 
423
            self._current_user = self._get_user()
 
424
        return self._current_user
406
425
 
407
426
    def publish_derived(self, local_branch, base_branch, name, project=None,
408
427
                        owner=None, revision_id=None, overwrite=False,
410
429
        base_owner, base_project, base_branch_name = parse_github_branch_url(base_branch)
411
430
        base_repo = self._get_repo(base_owner, base_project)
412
431
        if owner is None:
413
 
            owner = self._current_user['login']
 
432
            owner = self.current_user['login']
414
433
        if project is None:
415
434
            project = base_repo['name']
416
435
        try:
446
465
        base_owner, base_project, base_branch_name = parse_github_branch_url(base_branch)
447
466
        base_repo = self._get_repo(base_owner, base_project)
448
467
        if owner is None:
449
 
            owner = self._current_user['login']
 
468
            owner = self.current_user['login']
450
469
        if project is None:
451
470
            project = base_repo['name']
452
471
        try:
521
540
            query.append('is:closed')
522
541
        elif status == 'merged':
523
542
            query.append('is:merged')
524
 
        query.append('author:%s' % self._current_user['login'])
 
543
        query.append('author:%s' % self.current_user['login'])
525
544
        for issue in self._search_issues(query=' '.join(query)):
526
545
            url = issue['pull_request']['url']
527
546
            response = self._api_request('GET', url)
528
547
            if response.status != 200:
529
 
                raise InvalidHttpResponse(url, response.text)
 
548
                raise UnexpectedHttpStatus(url, response.status)
530
549
            yield GitHubMergeProposal(self, json.loads(response.text))
531
550
 
532
551
    def get_proposal_by_url(self, url):
535
554
    def iter_my_forks(self):
536
555
        response = self._api_request('GET', '/user/repos')
537
556
        if response.status != 200:
538
 
            raise InvalidHttpResponse(url, response.text)
 
557
            raise UnexpectedHttpStatus(self.transport.user_url, response.status)
539
558
        for project in json.loads(response.text):
540
559
            if not project['fork']:
541
560
                continue
550
569
            return
551
570
        if response.status == 200:
552
571
            return json.loads(response.text)
553
 
        raise InvalidHttpResponse(path, response.text)
 
572
        raise UnexpectedHttpStatus(path, response.status)
 
573
 
 
574
    def get_current_user(self):
 
575
        if self._token is not None:
 
576
            return self.current_user['login']
 
577
        return None
 
578
 
 
579
    def get_user_url(self, username):
 
580
        return urlutils.join(self.base_url, username)
554
581
 
555
582
 
556
583
class GitHubMergeProposalBuilder(MergeProposalBuilder):