/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: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2019-06-03 23:55:03 UTC
  • mfrom: (7296.9.5 land)
  • Revision ID: breezy.the.bot@gmail.com-20190603235503-7jzh8ex3k73gm28d
Add a 'brz land' subcommand.

Merged from https://code.launchpad.net/~jelmer/brz/land/+merge/366609

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
        self.url = url
55
55
 
56
56
 
 
57
class NotMergeRequestUrl(errors.BzrError):
 
58
 
 
59
    _fmt = "Not a merge proposal URL: %(url)s"
 
60
 
 
61
    def __init__(self, host, url):
 
62
        errors.BzrError.__init__(self)
 
63
        self.host = host
 
64
        self.url = url
 
65
 
 
66
 
57
67
class DifferentGitLabInstances(errors.BzrError):
58
68
 
59
69
    _fmt = ("Can't create merge proposals across GitLab instances: "
129
139
    return host, path, branch.name
130
140
 
131
141
 
 
142
def parse_gitlab_merge_request_url(url):
 
143
    (scheme, user, password, host, port, path) = urlutils.parse_url(
 
144
        url)
 
145
    if scheme not in ('git+ssh', 'https', 'http'):
 
146
        raise NotGitLabUrl(url)
 
147
    if not host:
 
148
        raise NotGitLabUrl(url)
 
149
    path = path.strip('/')
 
150
    parts = path.split('/')
 
151
    if parts[-2] != 'merge_requests':
 
152
        raise NotMergeRequestUrl(host, url)
 
153
    return host, '/'.join(parts[:-2]), int(parts[-1])
 
154
 
 
155
 
132
156
class GitLabMergeProposal(MergeProposal):
133
157
 
134
158
    def __init__(self, mr):
167
191
        self._mr.state_event = 'close'
168
192
        self._mr.save()
169
193
 
 
194
    def merge(self, commit_message=None):
 
195
        # https://docs.gitlab.com/ee/api/merge_requests.html#accept-mr
 
196
        self._mr.merge(merge_commit_message=commit_message)
 
197
 
170
198
 
171
199
def gitlab_url_to_bzr_url(url, name):
172
200
    if not PY3:
334
362
                owner=self.gl.user.username, state=state):
335
363
            yield GitLabMergeProposal(mp)
336
364
 
 
365
    def get_proposal_by_url(self, url):
 
366
        try:
 
367
            (host, project, merge_id) = parse_gitlab_merge_request_url(url)
 
368
        except NotGitLabUrl:
 
369
            raise UnsupportedHoster(url)
 
370
        except NotMergeRequestUrl as e:
 
371
            if self.gl.url == ('https://%s' % e.host):
 
372
                raise
 
373
            else:
 
374
                raise UnsupportedHoster(url)
 
375
        if self.gl.url != ('https://%s' % host):
 
376
            raise UnsupportedHoster(url)
 
377
        project = self.gl.projects.get(project)
 
378
        mr = project.mergerequests.get(merge_id)
 
379
        return GitLabMergeProposal(mr)
 
380
 
337
381
 
338
382
class GitlabMergeProposalBuilder(MergeProposalBuilder):
339
383