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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 7 additions & 1 deletion
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

Lines changed: 8 additions & 7 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 16 additions & 0 deletions
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

Lines changed: 16 additions & 1 deletion
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy