Skip to content

Commit 56f11fa

Browse files
authored
Merge branch 'main' into issue-2264-add-application-statistics
2 parents f3a8fcc + bd82d74 commit 56f11fa

File tree

7 files changed

+51
-13
lines changed

7 files changed

+51
-13
lines changed

.gitlab-ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
image: python:3.10
1+
image: python:3.11
22

33
stages:
44
- deploy

.pre-commit-config.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ repos:
77
hooks:
88
- id: black
99
- repo: https://github.com/commitizen-tools/commitizen
10-
rev: v2.35.0
10+
rev: v2.37.0
1111
hooks:
1212
- id: commitizen
1313
stages: [commit-msg]
@@ -47,6 +47,6 @@ repos:
4747
- id: rst-directive-colons
4848
- id: rst-inline-touching-normal
4949
- repo: https://github.com/maxbrunet/pre-commit-renovate
50-
rev: 33.1.0
50+
rev: 34.9.2
5151
hooks:
5252
- id: renovate-config-validator

docs/gl_objects/merge_requests.rst

+7-1
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,14 @@ Accept a MR::
122122

123123
mr.merge()
124124

125-
Cancel a MR when the build succeeds::
125+
Schedule a MR to merge after the pipeline(s) succeed::
126126

127+
mr.merge(merge_when_pipeline_succeeds=True)
128+
129+
Cancel a MR from merging when the pipeline succeeds::
130+
131+
# Cancel a MR from being merged that had been previously set to
132+
# 'merge_when_pipeline_succeeds=True'
127133
mr.cancel_merge_when_pipeline_succeeds()
128134

129135
List commits of a MR::

gitlab/v4/objects/merge_requests.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,7 @@ class ProjectMergeRequest(
165165

166166
@cli.register_custom_action("ProjectMergeRequest")
167167
@exc.on_http_error(exc.GitlabMROnBuildSuccessError)
168-
def cancel_merge_when_pipeline_succeeds(
169-
self, **kwargs: Any
170-
) -> "ProjectMergeRequest":
168+
def cancel_merge_when_pipeline_succeeds(self, **kwargs: Any) -> Dict[str, str]:
171169
"""Cancel merge when the pipeline succeeds.
172170
173171
Args:
@@ -179,17 +177,20 @@ def cancel_merge_when_pipeline_succeeds(
179177
request
180178
181179
Returns:
182-
ProjectMergeRequest
180+
dict of the parsed json returned by the server
183181
"""
184182

185183
path = (
186184
f"{self.manager.path}/{self.encoded_id}/cancel_merge_when_pipeline_succeeds"
187185
)
188-
server_data = self.manager.gitlab.http_put(path, **kwargs)
186+
server_data = self.manager.gitlab.http_post(path, **kwargs)
187+
# 2022-10-30: The docs at
188+
# https://docs.gitlab.com/ee/api/merge_requests.html#cancel-merge-when-pipeline-succeeds
189+
# are incorrect in that the return value is actually just:
190+
# {'status': 'success'} for a successful cancel.
189191
if TYPE_CHECKING:
190192
assert isinstance(server_data, dict)
191-
self._update_attrs(server_data)
192-
return ProjectMergeRequest(self.manager, server_data)
193+
return server_data
193194

194195
@cli.register_custom_action("ProjectMergeRequest")
195196
@exc.on_http_error(exc.GitlabListError)

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
requests==2.28.1
2-
requests-toolbelt==0.10.0
2+
requests-toolbelt==0.10.1

tests/functional/api/test_merge_requests.py

+16
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,27 @@ def test_merge_request_reset_approvals(gitlab_url, project, wait_for_sidekiq):
181181
assert mr.reset_approvals()
182182

183183

184+
def test_cancel_merge_when_pipeline_succeeds(project, merge_request, wait_for_sidekiq):
185+
mr = merge_request(source_branch="test_merge_request_merge", create_pipeline=True)
186+
# Set to merge when the pipeline succeeds, which should never happen
187+
mr.merge(merge_when_pipeline_succeeds=True)
188+
wait_for_sidekiq(timeout=60)
189+
190+
mr = project.mergerequests.get(mr.iid)
191+
assert mr.merged_at is None
192+
assert mr.merge_when_pipeline_succeeds is True
193+
cancel = mr.cancel_merge_when_pipeline_succeeds()
194+
assert cancel == {"status": "success"}
195+
196+
184197
def test_merge_request_merge(project, merge_request, wait_for_sidekiq):
185198
mr = merge_request(source_branch="test_merge_request_merge")
186199
mr.merge()
187200
wait_for_sidekiq(timeout=60)
188201

202+
mr = project.mergerequests.get(mr.iid)
203+
assert mr.merged_at is not None
204+
assert mr.merge_when_pipeline_succeeds is False
189205
with pytest.raises(gitlab.GitlabMRClosedError):
190206
# Two merge attempts should raise GitlabMRClosedError
191207
mr.merge()

tests/functional/conftest.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ def merge_request(project, wait_for_sidekiq):
388388

389389
to_delete = []
390390

391-
def _merge_request(*, source_branch: str):
391+
def _merge_request(*, source_branch: str, create_pipeline: bool = False):
392392
# Wait for processes to be done before we start...
393393
# NOTE(jlvillal): Sometimes the CI would give a "500 Internal Server
394394
# Error". Hoping that waiting until all other processes are done will
@@ -410,6 +410,21 @@ def _merge_request(*, source_branch: str):
410410
"commit_message": "New commit in new branch",
411411
}
412412
)
413+
if create_pipeline:
414+
project.files.create(
415+
{
416+
"file_path": ".gitlab-ci.yml",
417+
"branch": source_branch,
418+
"content": """
419+
test:
420+
rules:
421+
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
422+
script:
423+
- sleep 24h # We don't expect this to finish
424+
""",
425+
"commit_message": "Add a simple pipeline",
426+
}
427+
)
413428
mr = project.mergerequests.create(
414429
{
415430
"source_branch": source_branch,

0 commit comments

Comments
 (0)