/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-07-28 00:32:38 UTC
  • mfrom: (7490.40.77 work)
  • mto: (7490.40.79 work)
  • mto: This revision was merged to the branch mainline in revision 7521.
  • Revision ID: jelmer@jelmer.uk-20200728003238-vx5u412hn72f18lr
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
 
287
294
            raise NoSuchProject(path)
288
295
        if response.status == 200:
289
296
            return json.loads(response.text)
290
 
        raise InvalidHttpResponse(path, response.text)
 
297
        raise UnexpectedHttpStatus(path, response.status)
291
298
 
292
299
    def _get_repo_pulls(self, path, head=None, state=None):
293
300
        path = path + '?'
303
310
            raise NoSuchProject(path)
304
311
        if response.status == 200:
305
312
            return json.loads(response.text)
306
 
        raise InvalidHttpResponse(path, response.text)
 
313
        raise UnexpectedHttpStatus(path, response.status)
307
314
 
308
315
    def _create_pull(self, path, title, head, base, body=None, labels=None,
309
316
                     assignee=None, draft=False, maintainer_can_modify=False):
326
333
        if response.status == 403:
327
334
            raise PermissionDenied(path, response.text)
328
335
        if response.status != 201:
329
 
            raise InvalidHttpResponse(path, 'req is invalid %d %r: %r' % (response.status, data, response.text))
 
336
            raise UnexpectedHttpStatus(path, response.status)
330
337
        return json.loads(response.text)
331
338
 
332
339
    def _get_user_by_email(self, email):
333
340
        path = 'search/users?q=%s+in:email' % email
334
341
        response = self._api_request('GET', path)
335
342
        if response.status != 200:
336
 
            raise InvalidHttpResponse(path, response.text)
 
343
            raise UnexpectedHttpStatus(path, response.status)
337
344
        ret = json.loads(response.text)
338
345
        if ret['total_count'] == 0:
339
346
            raise KeyError('no user with email %s' % email)
348
355
            path = 'user'
349
356
        response = self._api_request('GET', path)
350
357
        if response.status != 200:
351
 
            raise InvalidHttpResponse(path, response.text)
 
358
            raise UnexpectedHttpStatus(path, response.status)
352
359
        return json.loads(response.text)
353
360
 
354
361
    def _get_organization(self, name):
355
362
        path = 'orgs/%s' % name
356
363
        response = self._api_request('GET', path)
357
364
        if response.status != 200:
358
 
            raise InvalidHttpResponse(path, response.text)
 
365
            raise UnexpectedHttpStatus(path, response.status)
359
366
        return json.loads(response.text)
360
367
 
361
368
    def _list_paged(self, path, parameters=None, per_page=None):
374
381
                ';'.join(['%s=%s' % (k, urlutils.quote(v))
375
382
                          for (k, v) in parameters.items()]))
376
383
            if response.status != 200:
377
 
                raise InvalidHttpResponse(path, response.text)
 
384
                raise UnexpectedHttpStatus(path, response.status)
378
385
            data = json.loads(response.text)
379
386
            for entry in data['items']:
380
387
                i += 1
388
395
        return self._list_paged(path, {'q': query}, per_page=DEFAULT_PER_PAGE)
389
396
 
390
397
    def _create_fork(self, path, owner=None):
391
 
        if owner and owner != self._current_user['login']:
 
398
        if owner and owner != self.current_user['login']:
392
399
            path += '?organization=%s' % owner
393
400
        response = self._api_request('POST', path)
394
401
        if response.status != 202:
395
 
            raise InvalidHttpResponse(path, 'status: %d, %r' % (response.status, response.text))
 
402
            raise UnexpectedHttpStatus(path, response.status)
396
403
        return json.loads(response.text)
397
404
 
398
405
    @property
402
409
    def __init__(self, transport):
403
410
        self._token = retrieve_github_token('https', GITHUB_HOST)
404
411
        self.transport = transport
405
 
        self._current_user = self._get_user()
 
412
        self._current_user = None
 
413
 
 
414
    @property
 
415
    def current_user(self):
 
416
        if self._current_user is None:
 
417
            self._current_user = self._get_user()
 
418
        return self._current_user
406
419
 
407
420
    def publish_derived(self, local_branch, base_branch, name, project=None,
408
421
                        owner=None, revision_id=None, overwrite=False,
410
423
        base_owner, base_project, base_branch_name = parse_github_branch_url(base_branch)
411
424
        base_repo = self._get_repo(base_owner, base_project)
412
425
        if owner is None:
413
 
            owner = self._current_user['login']
 
426
            owner = self.current_user['login']
414
427
        if project is None:
415
428
            project = base_repo['name']
416
429
        try:
446
459
        base_owner, base_project, base_branch_name = parse_github_branch_url(base_branch)
447
460
        base_repo = self._get_repo(base_owner, base_project)
448
461
        if owner is None:
449
 
            owner = self._current_user['login']
 
462
            owner = self.current_user['login']
450
463
        if project is None:
451
464
            project = base_repo['name']
452
465
        try:
521
534
            query.append('is:closed')
522
535
        elif status == 'merged':
523
536
            query.append('is:merged')
524
 
        query.append('author:%s' % self._current_user['login'])
 
537
        query.append('author:%s' % self.current_user['login'])
525
538
        for issue in self._search_issues(query=' '.join(query)):
526
539
            url = issue['pull_request']['url']
527
540
            response = self._api_request('GET', url)
528
541
            if response.status != 200:
529
 
                raise InvalidHttpResponse(url, response.text)
 
542
                raise UnexpectedHttpStatus(url, response.status)
530
543
            yield GitHubMergeProposal(self, json.loads(response.text))
531
544
 
532
545
    def get_proposal_by_url(self, url):
535
548
    def iter_my_forks(self):
536
549
        response = self._api_request('GET', '/user/repos')
537
550
        if response.status != 200:
538
 
            raise InvalidHttpResponse(url, response.text)
 
551
            raise UnexpectedHttpStatus(self.transport.user_url, response.status)
539
552
        for project in json.loads(response.text):
540
553
            if not project['fork']:
541
554
                continue
550
563
            return
551
564
        if response.status == 200:
552
565
            return json.loads(response.text)
553
 
        raise InvalidHttpResponse(path, response.text)
 
566
        raise UnexpectedHttpStatus(path, response.status)
 
567
 
 
568
    def get_current_user(self):
 
569
        return self.current_user['login']
 
570
 
 
571
    def get_user_url(self, username):
 
572
        return urlutils.join(self.base_url, username)
554
573
 
555
574
 
556
575
class GitHubMergeProposalBuilder(MergeProposalBuilder):