/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-01-08 22:04:13 UTC
  • mfrom: (7233.3.7 my-proposals)
  • Revision ID: breezy.the.bot@gmail.com-20190108220413-jnk79i8o4wk0h52j
Add 'bzr my-proposals' command.

Merged from https://code.launchpad.net/~jelmer/brz/my-proposals/+merge/361363

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
    MergeProposal,
34
34
    MergeProposalBuilder,
35
35
    MergeProposalExists,
36
 
    NoMergeProposal,
37
36
    NoSuchProject,
38
37
    PrerequisiteBranchUnsupported,
39
38
    UnsupportedHoster,
40
39
    )
41
40
 
 
41
def mp_status_to_status(status):
 
42
    return {
 
43
        'all': 'all',
 
44
        'open': 'opened',
 
45
        'merged': 'merged',
 
46
        'closed': 'closed'}[status]
 
47
 
42
48
 
43
49
class NotGitLabUrl(errors.BzrError):
44
50
 
83
89
        config.write(f)
84
90
 
85
91
 
 
92
def iter_tokens():
 
93
    import configparser
 
94
    from gitlab.config import _DEFAULT_FILES
 
95
    config = configparser.ConfigParser()
 
96
    config.read(_DEFAULT_FILES + [default_config_path()])
 
97
    for name, section in config.items():
 
98
        yield name, section
 
99
 
 
100
 
86
101
def connect_gitlab(host):
87
 
    from gitlab import Gitlab
 
102
    from gitlab import Gitlab, GitlabGetError
88
103
    auth = AuthenticationConfig()
89
104
 
90
105
    url = 'https://%s' % host
91
106
    credentials = auth.get_credentials('https', host)
92
107
    if credentials is None:
93
 
        import gitlab
94
 
        import configparser
95
 
        from gitlab.config import _DEFAULT_FILES
96
 
        config = configparser.ConfigParser()
97
 
        config.read(_DEFAULT_FILES + [default_config_path()])
98
 
        for name, section in config.items():
 
108
        for name, section in iter_tokens():
99
109
            if section.get('url') == url:
100
110
                credentials = section
101
111
                break
102
112
        else:
103
113
            try:
104
114
                return Gitlab(url)
105
 
            except gitlab.GitlabGetError:
 
115
            except GitlabGetError:
106
116
                raise GitLabLoginMissing()
107
117
    else:
108
118
        credentials['url'] = url
138
148
    def set_description(self, description):
139
149
        self._mr.description = description
140
150
 
 
151
    def _branch_url_from_project(self, project_id, branch_name):
 
152
        project = self._mr.manager.gitlab.projects.get(project_id)
 
153
        return gitlab_url_to_bzr_url(project.http_url_to_repo, branch_name)
 
154
 
 
155
    def get_source_branch_url(self):
 
156
        return self._branch_url_from_project(
 
157
            self._mr.source_project_id, self._mr.source_branch)
 
158
 
 
159
    def get_target_branch_url(self):
 
160
        return self._branch_url_from_project(
 
161
            self._mr.target_project_id, self._mr.target_branch)
 
162
 
141
163
    def is_merged(self):
142
 
        return (self._mr.attributes['state'] == 'merged')
 
164
        return (self._mr.state == 'merged')
143
165
 
144
166
 
145
167
def gitlab_url_to_bzr_url(url, name):
164
186
        (host, project_name, branch_name) = parse_gitlab_url(branch)
165
187
        project = self.gl.projects.get(project_name)
166
188
        return gitlab_url_to_bzr_url(
167
 
            project.attributes['ssh_url_to_repo'], branch_name)
 
189
            project.ssh_url_to_repo, branch_name)
168
190
 
169
191
    def publish_derived(self, local_branch, base_branch, name, project=None,
170
192
                        owner=None, revision_id=None, overwrite=False,
190
212
                target_project = base_project.forks.create({})
191
213
            else:
192
214
                raise
193
 
        remote_repo_url = git_url_to_bzr_url(target_project.attributes['ssh_url_to_repo'])
 
215
        remote_repo_url = git_url_to_bzr_url(target_project.ssh_url_to_repo)
194
216
        remote_dir = controldir.ControlDir.open(remote_repo_url)
195
217
        try:
196
218
            push_result = remote_dir.push_branch(
203
225
                local_branch, revision_id=revision_id, overwrite=overwrite,
204
226
                name=name, lossy=True)
205
227
        public_url = gitlab_url_to_bzr_url(
206
 
            target_project.attributes['http_url_to_repo'], name)
 
228
            target_project.http_url_to_repo, name)
207
229
        return push_result.target_branch, public_url
208
230
 
209
231
    def get_derived_branch(self, base_branch, name, project=None, owner=None):
228
250
                raise errors.NotBranchError('%s/%s/%s' % (self.gl.url, owner, project))
229
251
            raise
230
252
        return _mod_branch.Branch.open(gitlab_url_to_bzr_url(
231
 
            target_project.attributes['ssh_url_to_repo'], name))
 
253
            target_project.ssh_url_to_repo, name))
232
254
 
233
255
    def get_proposer(self, source_branch, target_branch):
234
256
        return GitlabMergeProposalBuilder(self.gl, source_branch, target_branch)
235
257
 
236
 
    def get_proposal(self, source_branch, target_branch):
 
258
    def iter_proposals(self, source_branch, target_branch, status):
 
259
        import gitlab
237
260
        (source_host, source_project_name, source_branch_name) = (
238
261
            parse_gitlab_url(source_branch))
239
262
        (target_host, target_project_name, target_branch_name) = (
243
266
        self.gl.auth()
244
267
        source_project = self.gl.projects.get(source_project_name)
245
268
        target_project = self.gl.projects.get(target_project_name)
 
269
        state = mp_status_to_status(status)
246
270
        try:
247
 
            for mr in target_project.mergerequests.list(state='all'):
248
 
                attrs = mr.attributes
249
 
                if (attrs['source_project_id'] != source_project.id or
250
 
                        attrs['source_branch'] != source_branch_name or
251
 
                        attrs['target_project_id'] != target_project.id or
252
 
                        attrs['target_branch'] != target_branch_name):
 
271
            for mr in target_project.mergerequests.list(state=state):
 
272
                if (mr.source_project_id != source_project.id or
 
273
                        mr.source_branch != source_branch_name or
 
274
                        mr.target_project_id != target_project.id or
 
275
                        mr.target_branch != target_branch_name):
253
276
                    continue
254
 
                return GitLabMergeProposal(mr)
 
277
                yield GitLabMergeProposal(mr)
255
278
        except gitlab.GitlabListError as e:
256
279
            if e.response_code == 403:
257
 
                raise PermissionDenied(e.error_message)
258
 
        raise NoMergeProposal()
 
280
                raise errors.PermissionDenied(e.error_message)
259
281
 
260
282
    def hosts(self, branch):
261
283
        try:
287
309
                raise
288
310
        return cls(gl)
289
311
 
 
312
    @classmethod
 
313
    def iter_instances(cls):
 
314
        from gitlab import Gitlab
 
315
        for name, credentials in iter_tokens():
 
316
            if 'url' not in credentials:
 
317
                continue
 
318
            gl = Gitlab(**credentials)
 
319
            yield cls(gl)
 
320
 
 
321
    def iter_my_proposals(self, status='open'):
 
322
        state = mp_status_to_status(status)
 
323
        self.gl.auth()
 
324
        for mp in self.gl.mergerequests.list(
 
325
                owner=self.gl.user.username, state=state):
 
326
            yield GitLabMergeProposal(mp)
 
327
 
290
328
 
291
329
class GitlabMergeProposalBuilder(MergeProposalBuilder):
292
330
 
343
381
            merge_request = source_project.mergerequests.create(kwargs)
344
382
        except gitlab.GitlabCreateError as e:
345
383
            if e.response_code == 403:
346
 
                raise PermissionDenied(e.error_message)
 
384
                raise errors.PermissionDenied(e.error_message)
347
385
            if e.response_code == 409:
348
386
                raise MergeProposalExists(self.source_branch.user_url)
349
387
            raise
350
388
        return GitLabMergeProposal(merge_request)
 
389
 
 
390
 
 
391
def register_gitlab_instance(shortname, url):
 
392
    """Register a gitlab instance.
 
393
 
 
394
    :param shortname: Short name (e.g. "gitlab")
 
395
    :param url: URL to the gitlab instance
 
396
    """
 
397
    from breezy.bugtracker import (
 
398
        tracker_registry,
 
399
        ProjectIntegerBugTracker,
 
400
        )
 
401
    tracker_registry.register(
 
402
        shortname, ProjectIntegerBugTracker(
 
403
            shortname, url + '/{project}/issues/{id}'))