22from gitlab .mixins import ListMixin
33from gitlab import cli
44from gitlab import exceptions as exc
5- from typing import Any , cast , Dict , Optional , TYPE_CHECKING , Union
6- from gitlab .types import RequiredOptional
5+ from typing import Any , Dict , Optional , Union
76
87import requests
98
109__all__ = [
1110 "ProjectMergeTrain" ,
1211 "ProjectMergeTrainManager" ,
13- # "ProjectMergeTrainMergeRequest",
14- # "ProjectMergeTrainMergeRequestManager",
12+ "ProjectMergeTrainMergeRequest" ,
13+ "ProjectMergeTrainMergeRequestManager" ,
1514]
1615
1716
1817class ProjectMergeTrain (RESTObject ):
18+ pass
19+
20+
21+ class ProjectMergeTrainMergeRequest (RESTObject ):
22+ _id_attr = "merge_request_iid"
23+
24+
25+ class ProjectMergeTrainManager (ListMixin , RESTManager ):
1926 _path = "/projects/{project_id}/merge_trains"
27+ _obj_cls = ProjectMergeTrain
28+ _from_parent_attrs = {"project_id" : "id" }
29+ _list_filters = ("scope" ,)
30+
31+
32+ class ProjectMergeTrainMergeRequestManager (RESTManager ):
33+ _path = "/projects/{project_id}/merge_trains"
34+ _obj_cls = ProjectMergeTrainMergeRequest
35+ _from_parent_attrs = {"project_id" : "id" }
2036
21- @cli .register_custom_action ("ProjectMergeTrain" )
22- def add (self , ** kwargs : Any ) -> Union [Dict [str , Any ], requests .Response ]:
37+ @cli .register_custom_action (
38+ "ProjectMergeTrainMergeRequestManager" ,
39+ (),
40+ (
41+ "when_pipeline_succeeds" ,
42+ "squash" ,
43+ "sha" ,
44+ )
45+
46+ )
47+ @exc .on_http_error (exc .GitlabCreateError )
48+ def add (
49+ self ,
50+ merge_request_iid : Union [str , int ],
51+ when_pipeline_succeeds : Optional [bool ] = None ,
52+ squash : Optional [bool ] = None ,
53+ ** kwargs : Any
54+ ) -> Union [Dict [str , Any ], requests .Response ]:
2355 """Attempt to merge changes between source and target branches into
2456 `/projects/:id/merge_trains/merge_requests/:merge_request_iid`.
2557
2658 Args:
2759 merge_request_iid: merge request id of the MR
60+ when_pipeline_succeeds: if true, the merge request is added to the merge train when the pipeline succeeds.
61+ When false or unspecified, the merge request is added directly to the merge train.
62+ squash: If true, the commits are squashed into a single commit on merge.
2863 **kwargs: Extra options to send to the server (e.g. sudo)
2964
3065 Raises:
31- GitlabGetError : If cannot be merged
66+ GitlabCreateError : If cannot add mr to merge train
3267 """
3368 path = (
34- f"{ self .manager . path } /merge_requests/{ self . encoded_id } "
69+ f"{ self .path } /merge_requests/{ merge_request_iid } "
3570 )
3671 data : Dict [str , Any ] = {}
37- data ["when_pipeline_succeeds" ] = True
38- return self .manager .gitlab .http_post (path , post_data = data , ** kwargs )
72+ if when_pipeline_succeeds :
73+ data ["when_pipeline_succeeds" ] = True
74+ if squash :
75+ data ["squash" ] = True
76+ return self .gitlab .http_post (path , post_data = data , ** kwargs )
3977
40- @cli .register_custom_action ("ProjectMergeTrain" )
41- def get_mr (self , ** kwargs : Any ) -> Union [Dict [str , Any ], requests .Response ]:
78+ @cli .register_custom_action ("ProjectMergeTrainMergeRequestManager" )
79+ @exc .on_http_error (exc .GitlabGetError )
80+ def get_mr (self , merge_request_iid : Union [str , int ], ** kwargs : Any ) -> Union [Dict [str , Any ], requests .Response ]:
4281 """Attempt to merge changes between source and target branches into
4382 `/projects/:id/merge_trains/merge_requests/:merge_request_iid`.
4483
@@ -49,87 +88,5 @@ def get_mr(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]:
4988 Raises:
5089 GitlabGetError: If cannot be merged
5190 """
52- path = f"{ self .manager .path } /merge_requests/{ self .encoded_id } "
53- return self .manager .gitlab .http_get (path , ** kwargs )
54-
55-
56- # class ProjectMergeTrainMergeRequest(ListMixin, RESTObject, RESTManager):
57- # _path = "/projects/{project_id}/merge_trains/merge_requests"
58- # _from_parent_attrs = {"project_id": "id"}
59- # _optional_get_attrs = (
60- # "when_pipeline_succeeds",
61- # "sha",
62- # "squash"
63- # )
64-
65- class ProjectMergeTrainManager (ListMixin , RESTManager , ProjectMergeTrain ):
66- _path = "/projects/{project_id}/merge_trains"
67- _obj_cls = ProjectMergeTrain
68- _from_parent_attrs = {"project_id" : "id" }
69- _list_filters = ("scope" ,)
70- _update_attrs = RequiredOptional (optional = ("when_pipeline_succeeds" , "squash" ,))
71- _optional_get_attrs = (
72- "when_pipeline_succeeds" ,
73- "sha" ,
74- "squash"
75- )
76-
77-
78- # @exc.on_http_error(exc.GitlabGetError)
79- # def get(self, id: Union[str, int], **kwargs: Any) -> Union[Dict[str, Any], requests.Response]:
80- # """Attempt to merge changes between source and target branches into
81- # `/projects/:id/merge_trains/merge_requests/:merge_request_iid`.
82- #
83- # Args:
84- # merge_request_iid: merge request id of the MR
85- # **kwargs: Extra options to send to the server (e.g. sudo)
86- #
87- # Raises:
88- # GitlabGetError: If cannot be merged
89- # """
90- # path = f"{self.manager.path}/merge_requests/{id}"
91- # return self.manager.gitlab.http_get(path, **kwargs)
92- #
93- # #@cli.register_custom_action("ProjectMergeTrain")
94- # @exc.on_http_error(exc.GitlabGetError)
95- # def add(self, id: Union[str, int], **kwargs: Any) -> Union[Dict[str, Any], requests.Response]:
96- # """Attempt to merge changes between source and target branches into
97- # `/projects/:id/merge_trains/merge_requests/:merge_request_iid`.
98- #
99- # Args:
100- # merge_request_iid: merge request id of the MR
101- # **kwargs: Extra options to send to the server (e.g. sudo)
102- #
103- # Raises:
104- # GitlabGetError: If cannot be merged
105- # """
106- # path = f"{self.manager.path}/merge_requests/{id}"
107- # return self.manager.gitlab.http_post(path, **kwargs)
108- #
109- #
110- # # class ProjectMergeTrainMergeRequestManager(ProjectMergeTrainMergeRequest):
111- # # pass
112- #
113- #
114- #
115- # #
116- # # class ProjectMergeTrainMergeRequestManager(ListMixin, RESTManager):
117- # # _path = "/projects/{project_id}/merge_trains/merge_request"
118- # #
119- # #
120- # #
121- # # @cli.register_custom_action("MergeTrain", ("merge_request_iid",))
122- # @exc.on_http_error(exc.GitlabDeleteError)
123- # def unshare(self, group_id: int, **kwargs: Any) -> None:
124- # """Delete a shared project link within a group.
125- #
126- # Args:
127- # group_id: ID of the group.
128- # **kwargs: Extra options to send to the server (e.g. sudo)
129- #
130- # Raises:
131- # GitlabAuthenticationError: If authentication is not correct
132- # GitlabDeleteError: If the server failed to perform the request
133- # """
134- # path = f"/projects/{self.encoded_id}/share/{group_id}"
135- # self.manager.gitlab.http_delete(path, **kwargs)
91+ path = f"{ self .path } /merge_requests/{ merge_request_iid } "
92+ return self .gitlab .http_get (path , ** kwargs )
0 commit comments