Merge lp:~jelmer/brz/merge-mode into lp:brz/3.3

Proposed by Jelmer Vernooij
Status: Needs review
Proposed branch: lp:~jelmer/brz/merge-mode
Merge into: lp:brz/3.3
Diff against target: 195 lines (+71/-12)
4 files modified
breezy/forge.py (+10/-1)
breezy/plugins/github/forge.py (+37/-3)
breezy/plugins/gitlab/forge.py (+13/-2)
breezy/plugins/launchpad/forge.py (+11/-6)
To merge this branch: bzr merge lp:~jelmer/brz/merge-mode
Reviewer Review Type Date Requested Status
Breezy developers Pending
Review via email: mp+435020@code.launchpad.net

Commit message

Add method and remove_source_branch arguments to MergeProposal.merge()

Description of the change

Add method and remove_source_branch arguments to MergeProposal.merge()

To post a comment you must log in.

Unmerged revisions

7766. By Jelmer Vernooij

Add method and remove_source_branch arguments.

7765. By Jelmer Vernooij

Use TemporaryDirectory.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'breezy/forge.py'
2--- breezy/forge.py 2022-12-15 14:18:30 +0000
3+++ breezy/forge.py 2022-12-30 17:22:49 +0000
4@@ -123,6 +123,13 @@
5 target_branch=target_branch)
6
7
8+MERGE_METHOD_MERGE = "merge"
9+MERGE_METHOD_REBASE = "rebase"
10+MERGE_METHOD_SQUASH = "squash"
11+
12+MERGE_METHODS = [MERGE_METHOD_MERGE, MERGE_METHOD_REBASE, MERGE_METHOD_SQUASH]
13+
14+
15 class MergeProposal(object):
16 """A merge proposal.
17
18@@ -198,7 +205,9 @@
19 """
20 raise NotImplementedError(self.is_closed)
21
22- def merge(self, commit_message=None, auto=False):
23+ def merge(
24+ self, commit_message=None, auto=False, method=MERGE_METHOD_MERGE,
25+ remove_source_branch: bool = False):
26 """Merge this merge proposal."""
27 raise NotImplementedError(self.merge)
28
29
30=== modified file 'breezy/plugins/github/forge.py'
31--- breezy/plugins/github/forge.py 2022-12-15 14:18:30 +0000
32+++ breezy/plugins/github/forge.py 2022-12-30 17:22:49 +0000
33@@ -31,6 +31,9 @@
34 PrerequisiteBranchUnsupported,
35 ReopenFailed,
36 UnsupportedForge,
37+ MERGE_METHOD_MERGE,
38+ MERGE_METHOD_REBASE,
39+ MERGE_METHOD_SQUASH,
40 )
41
42 from ... import (
43@@ -221,13 +224,34 @@
44 def can_be_merged(self):
45 return self._pr['mergeable']
46
47- def merge(self, commit_message=None, auto=False):
48+ def merge(self, commit_message=None, auto=False, method=MERGE_METHOD_MERGE,
49+ remove_source_branch=False):
50+ if self._pr['delete_branch_on_merge'] != remove_source_branch:
51+ self._patch(delete_branch_on_merge=remove_source_branch)
52 if auto:
53+ if commit_message:
54+ lines = commit_message.splitlines(True)
55+ commit_headline = lines[0]
56+ commit_body = ''.join(lines[1:])
57+ else:
58+ commit_headline = None
59+ commit_body = None
60+ if method == MERGE_METHOD_MERGE:
61+ merge_method = 'MERGE'
62+ elif method == MERGE_METHOD_REBASE:
63+ merge_method = 'REBASE'
64+ elif method == MERGE_METHOD_SQUASH:
65+ merge_method = 'SQUASH'
66+ else:
67+ raise NotImplementedError
68+
69 graphql_query = """
70 mutation ($pullRequestId: ID!) {
71 enablePullRequestAutoMerge(input: {
72 pullRequestId: $pullRequestId,
73- mergeMethod: MERGE
74+ mergeMethod: $mergeMethod
75+ commitHeadline: $commitHeadline
76+ commitBody: $commitBody
77 }) {
78 pullRequest {
79 autoMergeRequest {
80@@ -241,12 +265,22 @@
81 }
82 """
83 self._gh._graphql_request(
84- graphql_query, pullRequestId=self._pr["node_id"])
85+ graphql_query, pullRequestId=self._pr["node_id"],
86+ mergeMethod=merge_method, commitHeadline=commit_headline,
87+ commitBody=commit_body)
88 else:
89 # https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button
90 data = {}
91 if commit_message:
92 data['commit_message'] = commit_message
93+ if method == MERGE_METHOD_MERGE:
94+ data['merge_method'] = 'merge'
95+ elif method == MERGE_METHOD_REBASE:
96+ data['merge_method'] = 'rebase'
97+ elif method == MERGE_METHOD_SQUASH:
98+ data['merge_method'] = 'squash'
99+ else:
100+ raise NotImplementedError
101 response = self._gh._api_request(
102 'PUT', self._pr['url'] + "/merge", body=json.dumps(data).encode('utf-8'))
103 if response.status == 422:
104
105=== modified file 'breezy/plugins/gitlab/forge.py'
106--- breezy/plugins/gitlab/forge.py 2022-12-16 01:12:37 +0000
107+++ breezy/plugins/gitlab/forge.py 2022-12-30 17:22:49 +0000
108@@ -44,6 +44,8 @@
109 SourceNotDerivedFromTarget,
110 UnsupportedForge,
111 ForgeLoginRequired,
112+ MERGE_METHOD_MERGE,
113+ MERGE_METHOD_SQUASH,
114 )
115
116
117@@ -353,12 +355,21 @@
118 def close(self):
119 self._update(state_event='close')
120
121- def merge(self, commit_message=None, auto=False):
122+ def merge(self, commit_message=None, auto=False, method=MERGE_METHOD_MERGE,
123+ remove_source_branch=False):
124+ if method == MERGE_METHOD_MERGE:
125+ squash = False
126+ elif method == MERGE_METHOD_SQUASH:
127+ squash = True
128+ else:
129+ raise NotImplementedError(self.merge)
130 # https://docs.gitlab.com/ee/api/merge_requests.html#accept-mr
131 ret = self.gl._merge_mr(
132 self._mr['project_id'], self._mr['iid'],
133 kwargs={"merge_commit_message": commit_message,
134- "merge_when_pipeline_succeeds": auto})
135+ "merge_when_pipeline_succeeds": auto,
136+ "squash": squash,
137+ "should_remove_source_branch": remove_source_branch})
138 self._mr.update(ret)
139
140 def can_be_merged(self):
141
142=== modified file 'breezy/plugins/launchpad/forge.py'
143--- breezy/plugins/launchpad/forge.py 2022-12-21 12:52:20 +0000
144+++ breezy/plugins/launchpad/forge.py 2022-12-30 17:22:49 +0000
145@@ -18,7 +18,6 @@
146 """Support for Launchpad."""
147
148 import re
149-import shutil
150 import tempfile
151
152 from ...forge import (
153@@ -30,6 +29,7 @@
154 UnsupportedForge,
155 TitleUnsupported,
156 AutoMergeUnsupported,
157+ MERGE_METHOD_MERGE,
158 )
159
160 from ... import (
161@@ -220,9 +220,12 @@
162 def get_merged_at(self):
163 return self._mp.date_merged
164
165- def merge(self, commit_message=None, auto=False):
166+ def merge(self, commit_message=None, auto=False, method=MERGE_METHOD_MERGE,
167+ remove_source_branch=False):
168 if auto:
169 raise AutoMergeUnsupported(self)
170+ if method != MERGE_METHOD_MERGE:
171+ raise NotImplementedError("merge method %s unsupported" % method)
172 target_branch = _mod_branch.Branch.open(
173 self.get_target_branch_url())
174 source_branch = _mod_branch.Branch.open(
175@@ -230,14 +233,16 @@
176 # TODO(jelmer): Ideally this would use a memorytree, but merge doesn't
177 # support that yet.
178 # tree = target_branch.create_memorytree()
179- tmpdir = tempfile.mkdtemp()
180- try:
181+ with tempfile.TemporaryDirectory() as tmpdir:
182 tree = target_branch.create_checkout(
183 to_location=tmpdir, lightweight=True)
184 tree.merge_from_branch(source_branch)
185 tree.commit(commit_message or self._mp.commit_message)
186- finally:
187- shutil.rmtree(tmpdir)
188+ if remove_source_branch:
189+ if self._mp.source_branch:
190+ self._mp.source_branch.lp_delete()
191+ else:
192+ source_branch.controldir.destroy_branch(name=source_branch.name)
193
194 def post_comment(self, body):
195 self._mp.createComment(content=body)

Subscribers

People subscribed via source and target branches