Merge lp:~jelmer/brz/proposal-conflict into lp:brz/3.1

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/proposal-conflict
Merge into: lp:brz/3.1
Diff against target: 98 lines (+30/-16)
1 file modified
breezy/plugins/gitlab/hoster.py (+30/-16)
To merge this branch: bzr merge lp:~jelmer/brz/proposal-conflict
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+399949@code.launchpad.net

Commit message

Handle 409s better for gitlab merge proposals.

Description of the change

Handle 409s better for gitlab.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'breezy/plugins/gitlab/hoster.py'
2--- breezy/plugins/gitlab/hoster.py 2021-03-16 15:18:26 +0000
3+++ breezy/plugins/gitlab/hoster.py 2021-03-21 14:25:38 +0000
4@@ -84,7 +84,8 @@
5 _fmt = "GitLab can not process request: %(error)s."
6
7 def __init__(self, error):
8- errors.BzrError.__init__(self, error=error)
9+ errors.BzrError.__init__(self)
10+ self.error = error
11
12
13 class DifferentGitLabInstances(errors.BzrError):
14@@ -115,7 +116,8 @@
15 _fmt = "Conflict during operation: %(reason)s"
16
17 def __init__(self, reason):
18- errors.BzrError(self, reason=reason)
19+ errors.BzrError(self)
20+ self.reason = reason
21
22
23 class ForkingDisabled(errors.BzrError):
24@@ -231,7 +233,13 @@
25 self._mr = mr
26
27 def _update(self, **kwargs):
28- self.gl._update_merge_request(self._mr['project_id'], self._mr['iid'], kwargs)
29+ try:
30+ self.gl._update_merge_request(
31+ self._mr['project_id'], self._mr['iid'], kwargs)
32+ except GitLabConflict as e:
33+ self.gl._handle_merge_request_conflict(
34+ e.reason, self.get_source_branch_url(),
35+ self._mr['target_project_id'])
36
37 def __repr__(self):
38 return "<%s at %r>" % (type(self).__name__, self._mr['web_url'])
39@@ -449,6 +457,18 @@
40 project = self._get_project(project['path_with_namespace'])
41 return project
42
43+ def _handle_merge_request_conflict(self, reason, source_url, target_project):
44+ m = re.fullmatch(
45+ r'Another open merge request already exists for '
46+ r'this source branch: \!([0-9]+)',
47+ reason['message'][0])
48+ if m:
49+ merge_id = int(m.group(1))
50+ mr = self._get_merge_request(target_project, merge_id)
51+ raise MergeProposalExists(
52+ source_url, GitLabMergeProposal(self, mr))
53+ raise MergeRequestConflict(reason)
54+
55 def get_current_user(self):
56 return self._current_user['username']
57
58@@ -508,6 +528,8 @@
59 response = self._api_request('PUT', path, fields=mr)
60 if response.status == 200:
61 return json.loads(response.data)
62+ if response.status == 409:
63+ raise GitLabConflict(json.loads(response.data).get('message'))
64 if response.status == 403:
65 raise errors.PermissionDenied(response.text)
66 _unexpected_status(path, response)
67@@ -542,7 +564,7 @@
68 if response.status == 403:
69 raise errors.PermissionDenied(response.text)
70 if response.status == 409:
71- raise MergeRequestConflict(json.loads(response.data))
72+ raise GitLabConflict(json.loads(response.data).get('message'))
73 if response.status == 422:
74 data = json.loads(response.data)
75 raise GitLabUnprocessable(data['error'])
76@@ -780,18 +802,10 @@
77 kwargs['assignee_ids'].append(user['id'])
78 try:
79 merge_request = self.gl._create_mergerequest(**kwargs)
80- except MergeRequestConflict as e:
81- m = re.fullmatch(
82- r'Another open merge request already exists for '
83- r'this source branch: \!([0-9]+)',
84- e.reason['message'][0])
85- if m:
86- merge_id = int(m.group(1))
87- mr = self.gl._get_merge_request(
88- target_project['path_with_namespace'], merge_id)
89- raise MergeProposalExists(
90- self.source_branch.user_url, GitLabMergeProposal(self.gl, mr))
91- raise Exception('conflict: %r' % e.reason)
92+ except GitLabConflict as e:
93+ self.gl._handle_merge_request_conflict(
94+ e.reason, self.source_branch.user_url,
95+ target_project['path_with_namespace'])
96 except GitLabUnprocessable as e:
97 if e.error == [
98 "Source project is not a fork of the target project"]:

Subscribers

People subscribed via source and target branches