Skip to content

Commit 67d06e1

Browse files
committed
Use manual merge instead of changing project settings
1 parent 31f0f4f commit 67d06e1

File tree

3 files changed

+34
-30
lines changed

3 files changed

+34
-30
lines changed

marge/merge_request.py

+9-20
Original file line numberDiff line numberDiff line change
@@ -116,26 +116,15 @@ def comment(self, message):
116116

117117
return self._api.call(POST(notes_url, {'body': message}))
118118

119-
def accept(self, remove_branch=False, sha=None, trust_pipeline=True, project=None):
120-
reset = False
121-
if not trust_pipeline:
122-
# Temporarily remove flag, because we want to merge based on another pipeline
123-
if project.only_allow_merge_if_pipeline_succeeds:
124-
reset = True
125-
project.set_only_allow_merge_if_pipeline_succeeds(False, self._api)
126-
try:
127-
result = self._api.call(PUT(
128-
'/projects/{0.project_id}/merge_requests/{0.iid}/merge'.format(self),
129-
dict(
130-
should_remove_source_branch=remove_branch,
131-
merge_when_pipeline_succeeds=trust_pipeline,
132-
sha=sha or self.sha, # if provided, ensures what is merged is what we want (or fails)
133-
),
134-
))
135-
finally:
136-
if reset:
137-
project.set_only_allow_merge_if_pipeline_succeeds(True, self._api)
138-
return result
119+
def accept(self, remove_branch=False, sha=None):
120+
return self._api.call(PUT(
121+
'/projects/{0.project_id}/merge_requests/{0.iid}/merge'.format(self),
122+
dict(
123+
should_remove_source_branch=remove_branch,
124+
merge_when_pipeline_succeeds=True,
125+
sha=sha or self.sha, # if provided, ensures what is merged is what we want (or fails)
126+
),
127+
))
139128

140129
def close(self):
141130
return self._api.call(PUT(

marge/project.py

-6
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,6 @@ def access_level(self):
7373
assert effective_access is not None, "GitLab failed to provide user permissions on project"
7474
return AccessLevel(effective_access['access_level'])
7575

76-
def set_only_allow_merge_if_pipeline_succeeds(self, value, api):
77-
return api.call(PUT(
78-
'/projects/%s' % self.info['id'],
79-
{'only_allow_merge_if_pipeline_succeeds': value}
80-
))
81-
8276
def protect_branch(self, branch, api):
8377
return api.call(POST(
8478
'/projects/%s/protected_branches' % self.info['id'],

marge/single_merge_job.py

+25-4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def update_merge_request_and_accept(self, approvals):
4444
api = self._api
4545
merge_request = self._merge_request
4646
updated_into_up_to_date_target_branch = False
47+
temp_branch = self.opts.temp_branch
4748

4849
while not updated_into_up_to_date_target_branch:
4950
self.ensure_mergeable_mr(merge_request)
@@ -67,16 +68,36 @@ def update_merge_request_and_accept(self, approvals):
6768

6869
trust = True
6970
if self._project.only_allow_merge_if_pipeline_succeeds:
71+
if temp_branch and source_project is not self._project:
72+
trust = False
7073
self.wait_for_ci_to_pass(merge_request, actual_sha)
7174
time.sleep(2)
72-
if self.opts.temp_branch and source_project is not self._project:
73-
trust = False
7475

7576
self.ensure_mergeable_mr(merge_request)
7677

7778
try:
78-
merge_request.accept(remove_branch=True, sha=actual_sha, trust_pipeline=trust,
79-
project=self._project)
79+
if trust:
80+
merge_request.accept(remove_branch=True, sha=actual_sha)
81+
else:
82+
# Cannot accept the MR using the API, because it requires a passing pipeline
83+
# but the pipeline associated to the MR cannot be trusted. Use manual merging
84+
log.info('Merging %r manually (into: %r)', temp_branch, merge_request.target_branch)
85+
try:
86+
final_sha = self.repo.fast_forward(
87+
merge_request.target_branch,
88+
temp_branch,
89+
)
90+
assert final_sha == actual_sha
91+
self.repo.push(merge_request.target_branch, force=False)
92+
except AssertionError:
93+
log.warning('sha mismatch!')
94+
raise CannotMerge('Manually merged branch does not match source branch!')
95+
except git.GitError:
96+
log.warning('Failed to push!')
97+
raise CannotMerge(
98+
'Failed to push manually merged branch!'
99+
'Do I have permission to push to **%s**?' % merge_request.target_branch
100+
)
80101
except gitlab.NotAcceptable as err:
81102
new_target_sha = Commit.last_on_branch(self._project.id, merge_request.target_branch, api).id
82103
# target_branch has moved under us since we updated, just try again

0 commit comments

Comments
 (0)