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

  • Committer: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2019-07-28 23:23:29 UTC
  • mfrom: (7371.4.4 github-proposals-fix)
  • Revision ID: breezy.the.bot@gmail.com-20190728232329-6z8svq85fl1yjm4w
Fix iter_proposals for GitHub and GitLab.

Merged from https://code.launchpad.net/~jelmer/brz/github-proposals-fix/+merge/370033

Show diffs side-by-side

added added

removed removed

Lines of Context:
108
108
 
109
109
class GitHubMergeProposal(MergeProposal):
110
110
 
111
 
    def __init__(self, pr):
 
111
    def __init__(self, gh, pr):
 
112
        self._gh = gh
112
113
        self._pr = pr
113
114
 
114
115
    @property
130
131
    def get_commit_message(self):
131
132
        return None
132
133
 
 
134
    def set_commit_message(self, message):
 
135
        self._patch({'title': message})
 
136
 
 
137
    def _patch(self, data):
 
138
        response = self._gh._api_request(
 
139
            'PATCH', self._pr['url'], body=json.dumps(data).encode('utf-8'))
 
140
        if response != 200:
 
141
            raise InvalidHttpResponse(self._pr['url'], response.text)
 
142
        self._pr = json.loads(response.text)
 
143
 
133
144
    def set_description(self, description):
134
 
        self._pr.edit(body=description, title=determine_title(description))
 
145
        self._patch({
 
146
            'body': description,
 
147
            'title': determine_title(description),
 
148
            })
135
149
 
136
150
    def is_merged(self):
137
 
        return self._pr['merged']
 
151
        return self._pr['state'] == 'merged'
138
152
 
139
153
    def close(self):
140
 
        self._pr.edit(state='closed')
 
154
        self._patch({'state': 'closed'})
141
155
 
142
156
    def merge(self, commit_message=None):
143
157
        # https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button
178
192
    def __repr__(self):
179
193
        return "GitHub()"
180
194
 
181
 
    def _api_request(self, method, path):
 
195
    def _api_request(self, method, path, body=None):
182
196
        headers = {
183
197
            'Accept': 'application/vnd.github.v3+json'}
184
198
        if self._token:
185
199
            headers['Authorization'] = 'token %s' % self._token
186
200
        response = self.transport.request(
187
201
            method, urlutils.join(self.transport.base, path),
188
 
            headers=headers)
 
202
            headers=headers, body=body)
189
203
        if response.status == 401:
190
204
            raise GitHubLoginRequired(self)
191
205
        return response
199
213
            return json.loads(response.text)
200
214
        raise InvalidHttpResponse(path, response.text)
201
215
 
 
216
    def _get_repo_pulls(self, path, head=None, state=None):
 
217
        path = 'repos/' + path + '/pulls?'
 
218
        params = {}
 
219
        if head is not None:
 
220
            params['head'] = head
 
221
        if state is not None:
 
222
            params['state'] = state
 
223
        path += ';'.join(['%s=%s' % (k, urlutils.quote(v))
 
224
                         for k, v in params.items()])
 
225
        response = self._api_request('GET', path)
 
226
        if response.status == 404:
 
227
            raise NoSuchProject(path)
 
228
        if response.status == 200:
 
229
            return json.loads(response.text)
 
230
        raise InvalidHttpResponse(path, response.text)
 
231
 
202
232
    def _get_user(self, username=None):
203
233
        if username:
204
234
            path = 'users/:%s' % username
304
334
            parse_github_branch_url(source_branch))
305
335
        (target_owner, target_repo_name, target_branch_name) = (
306
336
            parse_github_branch_url(target_branch))
307
 
        target_repo = self._get_repo(
308
 
            "%s/%s" % (target_owner, target_repo_name))
 
337
        target_repo_path = "%s/%s" % (target_owner, target_repo_name)
 
338
        target_repo = self._get_repo(target_repo_path)
309
339
        state = {
310
340
            'open': 'open',
311
341
            'merged': 'closed',
312
342
            'closed': 'closed',
313
343
            'all': 'all'}
314
 
        for pull in target_repo.get_pulls(
315
 
                head=target_branch_name,
316
 
                state=state[status]):
317
 
            if (status == 'closed' and pull.merged or
318
 
                    status == 'merged' and not pull.merged):
319
 
                continue
320
 
            if pull.head.ref != source_branch_name:
321
 
                continue
322
 
            if pull.head.repo is None:
 
344
        pulls = self._get_repo_pulls(
 
345
            target_repo_path,
 
346
            head=target_branch_name,
 
347
            state=state[status])
 
348
        for pull in pulls:
 
349
            if (status == 'closed' and pull['merged'] or
 
350
                    status == 'merged' and not pull['merged']):
 
351
                continue
 
352
            if pull['head']['ref'] != source_branch_name:
 
353
                continue
 
354
            if pull['head']['repo'] is None:
323
355
                # Repo has gone the way of the dodo
324
356
                continue
325
 
            if (pull.head.repo.owner.login != source_owner or
326
 
                    pull.head.repo.name != source_repo_name):
 
357
            if (pull['head']['repo']['owner']['login'] != source_owner or
 
358
                    pull['head']['repo']['name'] != source_repo_name):
327
359
                continue
328
 
            yield GitHubMergeProposal(pull)
 
360
            yield GitHubMergeProposal(self, pull)
329
361
 
330
362
    def hosts(self, branch):
331
363
        try:
366
398
            response = self._api_request('GET', url)
367
399
            if response.status != 200:
368
400
                raise InvalidHttpResponse(url, response.text)
369
 
            yield GitHubMergeProposal(json.loads(response.text))
 
401
            yield GitHubMergeProposal(self, json.loads(response.text))
370
402
 
371
403
    def get_proposal_by_url(self, url):
372
404
        raise UnsupportedHoster(url)
430
462
        if labels:
431
463
            for label in labels:
432
464
                pull_request.issue.labels.append(label)
433
 
        return GitHubMergeProposal(pull_request)
 
465
        return GitHubMergeProposal(self.gh, pull_request)