From 7817cd20cda0c3c421cf4cbdace5d174b48041bb Mon Sep 17 00:00:00 2001 From: prashant varma Date: Thu, 20 Apr 2023 12:03:25 +0530 Subject: [PATCH 1/3] local test1 --- gitlab/exceptions.py | 2 + gitlab/v4/objects/merge_trains.py | 121 +++++++++++++++++++++++++++++- 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/gitlab/exceptions.py b/gitlab/exceptions.py index d3b0f5d77..1f8420e69 100644 --- a/gitlab/exceptions.py +++ b/gitlab/exceptions.py @@ -223,6 +223,8 @@ class GitlabTodoError(GitlabOperationError): class GitlabTopicMergeError(GitlabOperationError): pass +class GitlabMergeTrainError(GitlabOperationError): + pass class GitlabTimeTrackingError(GitlabOperationError): pass diff --git a/gitlab/v4/objects/merge_trains.py b/gitlab/v4/objects/merge_trains.py index 9f8e1dff0..00791d0e5 100644 --- a/gitlab/v4/objects/merge_trains.py +++ b/gitlab/v4/objects/merge_trains.py @@ -1,18 +1,135 @@ from gitlab.base import RESTManager, RESTObject from gitlab.mixins import ListMixin +from gitlab import cli +from gitlab import exceptions as exc +from typing import Any, cast, Dict, Optional, TYPE_CHECKING, Union +from gitlab.types import RequiredOptional + +import requests __all__ = [ "ProjectMergeTrain", "ProjectMergeTrainManager", + # "ProjectMergeTrainMergeRequest", + # "ProjectMergeTrainMergeRequestManager", ] class ProjectMergeTrain(RESTObject): - pass + _path = "/projects/{project_id}/merge_trains" + + @cli.register_custom_action("ProjectMergeTrain") + def add(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: + """Attempt to merge changes between source and target branches into + `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. + + Args: + merge_request_iid: merge request id of the MR + **kwargs: Extra options to send to the server (e.g. sudo) + + Raises: + GitlabGetError: If cannot be merged + """ + path = ( + f"{self.manager.path}/merge_requests/{self.encoded_id}" + ) + data: Dict[str, Any] = {} + data["when_pipeline_succeeds"] = True + return self.manager.gitlab.http_post(path, post_data=data, **kwargs) + + @cli.register_custom_action("ProjectMergeTrain") + def get_mr(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: + """Attempt to merge changes between source and target branches into + `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. + Args: + merge_request_iid: merge request id of the MR + **kwargs: Extra options to send to the server (e.g. sudo) -class ProjectMergeTrainManager(ListMixin, RESTManager): + Raises: + GitlabGetError: If cannot be merged + """ + path = f"{self.manager.path}/merge_requests/{self.encoded_id}" + return self.manager.gitlab.http_get(path, **kwargs) + + +# class ProjectMergeTrainMergeRequest(ListMixin, RESTObject, RESTManager): +# _path = "/projects/{project_id}/merge_trains/merge_requests" +# _from_parent_attrs = {"project_id": "id"} +# _optional_get_attrs = ( +# "when_pipeline_succeeds", +# "sha", +# "squash" +# ) + +class ProjectMergeTrainManager(ListMixin, RESTManager, ProjectMergeTrain): _path = "/projects/{project_id}/merge_trains" _obj_cls = ProjectMergeTrain _from_parent_attrs = {"project_id": "id"} _list_filters = ("scope",) + _update_attrs = RequiredOptional(optional=("when_pipeline_succeeds", "squash",)) + _optional_get_attrs = ( + "when_pipeline_succeeds", + "sha", + "squash" + ) + + +# @exc.on_http_error(exc.GitlabGetError) +# def get(self, id: Union[str, int], **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: +# """Attempt to merge changes between source and target branches into +# `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. +# +# Args: +# merge_request_iid: merge request id of the MR +# **kwargs: Extra options to send to the server (e.g. sudo) +# +# Raises: +# GitlabGetError: If cannot be merged +# """ +# path = f"{self.manager.path}/merge_requests/{id}" +# return self.manager.gitlab.http_get(path, **kwargs) +# +# #@cli.register_custom_action("ProjectMergeTrain") +# @exc.on_http_error(exc.GitlabGetError) +# def add(self, id: Union[str, int], **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: +# """Attempt to merge changes between source and target branches into +# `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. +# +# Args: +# merge_request_iid: merge request id of the MR +# **kwargs: Extra options to send to the server (e.g. sudo) +# +# Raises: +# GitlabGetError: If cannot be merged +# """ +# path = f"{self.manager.path}/merge_requests/{id}" +# return self.manager.gitlab.http_post(path, **kwargs) +# +# +# # class ProjectMergeTrainMergeRequestManager(ProjectMergeTrainMergeRequest): +# # pass +# +# +# +# # +# # class ProjectMergeTrainMergeRequestManager(ListMixin, RESTManager): +# # _path = "/projects/{project_id}/merge_trains/merge_request" +# # +# # +# # +# # @cli.register_custom_action("MergeTrain", ("merge_request_iid",)) +# @exc.on_http_error(exc.GitlabDeleteError) +# def unshare(self, group_id: int, **kwargs: Any) -> None: +# """Delete a shared project link within a group. +# +# Args: +# group_id: ID of the group. +# **kwargs: Extra options to send to the server (e.g. sudo) +# +# Raises: +# GitlabAuthenticationError: If authentication is not correct +# GitlabDeleteError: If the server failed to perform the request +# """ +# path = f"/projects/{self.encoded_id}/share/{group_id}" +# self.manager.gitlab.http_delete(path, **kwargs) From 06aa5fdd2e80a96d567eac97a411f1ed74f2f239 Mon Sep 17 00:00:00 2001 From: prashant varma Date: Thu, 20 Apr 2023 15:08:53 +0530 Subject: [PATCH 2/3] add mr to merge train --- gitlab/v4/objects/merge_trains.py | 149 +++++++++++------------------- gitlab/v4/objects/projects.py | 3 +- 2 files changed, 55 insertions(+), 97 deletions(-) diff --git a/gitlab/v4/objects/merge_trains.py b/gitlab/v4/objects/merge_trains.py index 00791d0e5..e41520d83 100644 --- a/gitlab/v4/objects/merge_trains.py +++ b/gitlab/v4/objects/merge_trains.py @@ -2,43 +2,82 @@ from gitlab.mixins import ListMixin from gitlab import cli from gitlab import exceptions as exc -from typing import Any, cast, Dict, Optional, TYPE_CHECKING, Union -from gitlab.types import RequiredOptional +from typing import Any, Dict, Optional, Union import requests __all__ = [ "ProjectMergeTrain", "ProjectMergeTrainManager", - # "ProjectMergeTrainMergeRequest", - # "ProjectMergeTrainMergeRequestManager", + "ProjectMergeTrainMergeRequest", + "ProjectMergeTrainMergeRequestManager", ] class ProjectMergeTrain(RESTObject): + pass + + +class ProjectMergeTrainMergeRequest(RESTObject): + _id_attr = "merge_request_iid" + + +class ProjectMergeTrainManager(ListMixin, RESTManager): _path = "/projects/{project_id}/merge_trains" + _obj_cls = ProjectMergeTrain + _from_parent_attrs = {"project_id": "id"} + _list_filters = ("scope",) + + +class ProjectMergeTrainMergeRequestManager(RESTManager): + _path = "/projects/{project_id}/merge_trains" + _obj_cls = ProjectMergeTrainMergeRequest + _from_parent_attrs = {"project_id": "id"} - @cli.register_custom_action("ProjectMergeTrain") - def add(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: + @cli.register_custom_action( + "ProjectMergeTrainMergeRequestManager", + (), + ( + "when_pipeline_succeeds", + "squash", + "sha", + ) + + ) + @exc.on_http_error(exc.GitlabCreateError) + def add( + self, + merge_request_iid: Union[str, int], + when_pipeline_succeeds: Optional[bool] = None, + squash: Optional[bool] = None, + **kwargs: Any + ) -> Union[Dict[str, Any], requests.Response]: """Attempt to merge changes between source and target branches into `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. Args: merge_request_iid: merge request id of the MR + when_pipeline_succeeds: if true, the merge request is added to the merge train when the pipeline succeeds. + When false or unspecified, the merge request is added directly to the merge train. + squash: If true, the commits are squashed into a single commit on merge. **kwargs: Extra options to send to the server (e.g. sudo) Raises: - GitlabGetError: If cannot be merged + GitlabCreateError: If cannot add mr to merge train """ path = ( - f"{self.manager.path}/merge_requests/{self.encoded_id}" + f"{self.path}/merge_requests/{merge_request_iid}" ) data: Dict[str, Any] = {} - data["when_pipeline_succeeds"] = True - return self.manager.gitlab.http_post(path, post_data=data, **kwargs) + if when_pipeline_succeeds: + data["when_pipeline_succeeds"] = True + if squash: + data["squash"] = True + return self.gitlab.http_post(path, post_data=data, **kwargs) - @cli.register_custom_action("ProjectMergeTrain") - def get_mr(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: + @cli.register_custom_action("ProjectMergeTrainMergeRequestManager") + @exc.on_http_error(exc.GitlabGetError) + def get_mr(self, merge_request_iid: Union[str, int], **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: """Attempt to merge changes between source and target branches into `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. @@ -49,87 +88,5 @@ def get_mr(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: Raises: GitlabGetError: If cannot be merged """ - path = f"{self.manager.path}/merge_requests/{self.encoded_id}" - return self.manager.gitlab.http_get(path, **kwargs) - - -# class ProjectMergeTrainMergeRequest(ListMixin, RESTObject, RESTManager): -# _path = "/projects/{project_id}/merge_trains/merge_requests" -# _from_parent_attrs = {"project_id": "id"} -# _optional_get_attrs = ( -# "when_pipeline_succeeds", -# "sha", -# "squash" -# ) - -class ProjectMergeTrainManager(ListMixin, RESTManager, ProjectMergeTrain): - _path = "/projects/{project_id}/merge_trains" - _obj_cls = ProjectMergeTrain - _from_parent_attrs = {"project_id": "id"} - _list_filters = ("scope",) - _update_attrs = RequiredOptional(optional=("when_pipeline_succeeds", "squash",)) - _optional_get_attrs = ( - "when_pipeline_succeeds", - "sha", - "squash" - ) - - -# @exc.on_http_error(exc.GitlabGetError) -# def get(self, id: Union[str, int], **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: -# """Attempt to merge changes between source and target branches into -# `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. -# -# Args: -# merge_request_iid: merge request id of the MR -# **kwargs: Extra options to send to the server (e.g. sudo) -# -# Raises: -# GitlabGetError: If cannot be merged -# """ -# path = f"{self.manager.path}/merge_requests/{id}" -# return self.manager.gitlab.http_get(path, **kwargs) -# -# #@cli.register_custom_action("ProjectMergeTrain") -# @exc.on_http_error(exc.GitlabGetError) -# def add(self, id: Union[str, int], **kwargs: Any) -> Union[Dict[str, Any], requests.Response]: -# """Attempt to merge changes between source and target branches into -# `/projects/:id/merge_trains/merge_requests/:merge_request_iid`. -# -# Args: -# merge_request_iid: merge request id of the MR -# **kwargs: Extra options to send to the server (e.g. sudo) -# -# Raises: -# GitlabGetError: If cannot be merged -# """ -# path = f"{self.manager.path}/merge_requests/{id}" -# return self.manager.gitlab.http_post(path, **kwargs) -# -# -# # class ProjectMergeTrainMergeRequestManager(ProjectMergeTrainMergeRequest): -# # pass -# -# -# -# # -# # class ProjectMergeTrainMergeRequestManager(ListMixin, RESTManager): -# # _path = "/projects/{project_id}/merge_trains/merge_request" -# # -# # -# # -# # @cli.register_custom_action("MergeTrain", ("merge_request_iid",)) -# @exc.on_http_error(exc.GitlabDeleteError) -# def unshare(self, group_id: int, **kwargs: Any) -> None: -# """Delete a shared project link within a group. -# -# Args: -# group_id: ID of the group. -# **kwargs: Extra options to send to the server (e.g. sudo) -# -# Raises: -# GitlabAuthenticationError: If authentication is not correct -# GitlabDeleteError: If the server failed to perform the request -# """ -# path = f"/projects/{self.encoded_id}/share/{group_id}" -# self.manager.gitlab.http_delete(path, **kwargs) + path = f"{self.path}/merge_requests/{merge_request_iid}" + return self.gitlab.http_get(path, **kwargs) diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py index a139f312f..994fe39e8 100644 --- a/gitlab/v4/objects/projects.py +++ b/gitlab/v4/objects/projects.py @@ -66,7 +66,7 @@ ProjectApprovalRuleManager, ) from .merge_requests import ProjectMergeRequestManager # noqa: F401 -from .merge_trains import ProjectMergeTrainManager # noqa: F401 +from .merge_trains import ProjectMergeTrainManager, ProjectMergeTrainMergeRequestManager # noqa: F401 from .milestones import ProjectMilestoneManager # noqa: F401 from .notes import ProjectNoteManager # noqa: F401 from .notification_settings import ProjectNotificationSettingsManager # noqa: F401 @@ -196,6 +196,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO members_all: ProjectMemberAllManager mergerequests: ProjectMergeRequestManager merge_trains: ProjectMergeTrainManager + merge_trains_merge_request: ProjectMergeTrainMergeRequestManager milestones: ProjectMilestoneManager notes: ProjectNoteManager notificationsettings: ProjectNotificationSettingsManager From ecaa5662e25fe91635ea70e6e6d17794f7e4fbdc Mon Sep 17 00:00:00 2001 From: prashant varma Date: Thu, 20 Apr 2023 15:21:03 +0530 Subject: [PATCH 3/3] remove exception as it is not required --- gitlab/exceptions.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/gitlab/exceptions.py b/gitlab/exceptions.py index 1f8420e69..d3b0f5d77 100644 --- a/gitlab/exceptions.py +++ b/gitlab/exceptions.py @@ -223,8 +223,6 @@ class GitlabTodoError(GitlabOperationError): class GitlabTopicMergeError(GitlabOperationError): pass -class GitlabMergeTrainError(GitlabOperationError): - pass class GitlabTimeTrackingError(GitlabOperationError): pass