From 5cae00c3a82fcc03fcb3cba34011e30a3088084b Mon Sep 17 00:00:00 2001 From: Eric Sabouraud Date: Thu, 7 Jun 2018 19:31:19 +0200 Subject: [PATCH 1/7] Add project push rules configuration --- docs/gl_objects/projects.rst | 26 ++++++++++++++++++++++++++ gitlab/v4/objects.py | 21 +++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/docs/gl_objects/projects.rst b/docs/gl_objects/projects.rst index 57d6b76b3..d3245f091 100644 --- a/docs/gl_objects/projects.rst +++ b/docs/gl_objects/projects.rst @@ -618,3 +618,29 @@ markdown to reference the uploaded file:: issue.notes.create({ "body": "See the [attached file]({})".format(uploaded_file["url"]) }) + +Project push rules +================== + +Reference +--------- + +* v4 API: + + + :class:`gitlab.v4.objects.ProjectPushRules` + + :class:`gitlab.v4.objects.ProjectPushRulesManager` + + :attr:`gitlab.v4.objects.Project.pushrules` + +* GitLab API: https://docs.gitlab.com/ee/api/projects.html#push-rules + +Examples +--------- + +Get project push rules:: + + pr = project.pushrules.get() + +Edit project push rules:: + + pr.branch_name_regex = '^(master|develop|support-\d+|release-\d+\..+|hotfix-.+|feature-.+)$' + pr.save() diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 13c9995fe..39907d2a1 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -2364,6 +2364,26 @@ class ProjectPipelineScheduleManager(CRUDMixin, RESTManager): ('description', 'ref', 'cron', 'cron_timezone', 'active')) +class ProjectPushRules(SaveMixin, ObjectDeleteMixin, RESTObject): + _id_attr = None + + +class ProjectPushRulesManager(GetWithoutIdMixin, CRUDMixin, RESTManager): + _path = '/projects/%(project_id)s/push_rule' + _obj_cls = ProjectPushRules + _from_parent_attrs = {'project_id': 'id'} + _create_attrs = (tuple(), + ('deny_delete_tag', 'member_check', + 'prevent_secrets', 'commit_message_regex', + 'branch_name_regex', 'author_email_regex', + 'file_name_regex', 'max_file_size')) + _update_attrs = (tuple(), + ('deny_delete_tag', 'member_check', + 'prevent_secrets', 'commit_message_regex', + 'branch_name_regex', 'author_email_regex', + 'file_name_regex', 'max_file_size')) + + class ProjectSnippetNoteAwardEmoji(ObjectDeleteMixin, RESTObject): pass @@ -2755,6 +2775,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject): ('pipelines', 'ProjectPipelineManager'), ('protectedbranches', 'ProjectProtectedBranchManager'), ('pipelineschedules', 'ProjectPipelineScheduleManager'), + ('pushrules', 'ProjectPushRulesManager'), ('runners', 'ProjectRunnerManager'), ('services', 'ProjectServiceManager'), ('snippets', 'ProjectSnippetManager'), From 37c41d56163ff2da26ddb93f1c73bb0a9a79b089 Mon Sep 17 00:00:00 2001 From: Eric Sabouraud Date: Thu, 7 Jun 2018 22:06:29 +0200 Subject: [PATCH 2/7] Try and fix CLI tests --- gitlab/v4/objects.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 39907d2a1..5bc3b911e 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -2364,11 +2364,11 @@ class ProjectPipelineScheduleManager(CRUDMixin, RESTManager): ('description', 'ref', 'cron', 'cron_timezone', 'active')) -class ProjectPushRules(SaveMixin, ObjectDeleteMixin, RESTObject): +class ProjectPushRules(SaveMixin, RESTObject): _id_attr = None -class ProjectPushRulesManager(GetWithoutIdMixin, CRUDMixin, RESTManager): +class ProjectPushRulesManager(GetWithoutIdMixin, UpdateMixin, RESTManager): _path = '/projects/%(project_id)s/push_rule' _obj_cls = ProjectPushRules _from_parent_attrs = {'project_id': 'id'} From 7e89fd08c62fb0c47df7f5c059116e5323c1b20f Mon Sep 17 00:00:00 2001 From: Eric Sabouraud Date: Thu, 7 Jun 2018 22:17:00 +0200 Subject: [PATCH 3/7] Remove unused _create_attrs (object no longer a CRUDMixin) --- gitlab/v4/objects.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 5bc3b911e..1c03cb825 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -2372,11 +2372,6 @@ class ProjectPushRulesManager(GetWithoutIdMixin, UpdateMixin, RESTManager): _path = '/projects/%(project_id)s/push_rule' _obj_cls = ProjectPushRules _from_parent_attrs = {'project_id': 'id'} - _create_attrs = (tuple(), - ('deny_delete_tag', 'member_check', - 'prevent_secrets', 'commit_message_regex', - 'branch_name_regex', 'author_email_regex', - 'file_name_regex', 'max_file_size')) _update_attrs = (tuple(), ('deny_delete_tag', 'member_check', 'prevent_secrets', 'commit_message_regex', From 0304ed363b990ecc84cc6bb47034c4e6b41ced06 Mon Sep 17 00:00:00 2001 From: Eric Sabouraud Date: Mon, 11 Jun 2018 11:04:02 +0200 Subject: [PATCH 4/7] Implement create/delete for push_rule endpoint --- gitlab/mixins.py | 11 ++++++++--- gitlab/v4/objects.py | 10 ++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/gitlab/mixins.py b/gitlab/mixins.py index 966a647fe..761fed875 100644 --- a/gitlab/mixins.py +++ b/gitlab/mixins.py @@ -66,6 +66,8 @@ def get(self, id=None, **kwargs): GitlabGetError: If the server cannot perform the request """ server_data = self.gitlab.http_get(self.path, **kwargs) + if server_data is None: + return None return self._obj_cls(self, server_data) @@ -305,9 +307,12 @@ def delete(self, id, **kwargs): GitlabAuthenticationError: If authentication is not correct GitlabDeleteError: If the server cannot perform the request """ - if not isinstance(id, int): - id = id.replace('/', '%2F') - path = '%s/%s' % (self.path, id) + if id is None: + path = self.path + else: + if not isinstance(id, int): + id = id.replace('/', '%2F') + path = '%s/%s' % (self.path, id) self.gitlab.http_delete(path, **kwargs) diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 1c03cb825..f36475b6d 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -2364,14 +2364,20 @@ class ProjectPipelineScheduleManager(CRUDMixin, RESTManager): ('description', 'ref', 'cron', 'cron_timezone', 'active')) -class ProjectPushRules(SaveMixin, RESTObject): +class ProjectPushRules(SaveMixin, ObjectDeleteMixin, RESTObject): _id_attr = None -class ProjectPushRulesManager(GetWithoutIdMixin, UpdateMixin, RESTManager): +class ProjectPushRulesManager(GetWithoutIdMixin, CreateMixin, UpdateMixin, + DeleteMixin, RESTManager): _path = '/projects/%(project_id)s/push_rule' _obj_cls = ProjectPushRules _from_parent_attrs = {'project_id': 'id'} + _create_attrs = (tuple(), + ('deny_delete_tag', 'member_check', + 'prevent_secrets', 'commit_message_regex', + 'branch_name_regex', 'author_email_regex', + 'file_name_regex', 'max_file_size')) _update_attrs = (tuple(), ('deny_delete_tag', 'member_check', 'prevent_secrets', 'commit_message_regex', From 8b06fa29f6ecf88a74897ddedb89f2521b1d0aa2 Mon Sep 17 00:00:00 2001 From: Eric Sabouraud Date: Mon, 11 Jun 2018 11:33:21 +0200 Subject: [PATCH 5/7] Fix unit tests (delete without id) --- gitlab/v4/cli.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gitlab/v4/cli.py b/gitlab/v4/cli.py index 0e50de174..451bec8be 100644 --- a/gitlab/v4/cli.py +++ b/gitlab/v4/cli.py @@ -143,8 +143,9 @@ def _populate_sub_parser_by_class(cls, sub_parser): action='store_true') if action_name == 'delete': - id_attr = cls._id_attr.replace('_', '-') - sub_parser_action.add_argument("--%s" % id_attr, required=True) + if cls._id_attr is not None: + id_attr = cls._id_attr.replace('_', '-') + sub_parser_action.add_argument("--%s" % id_attr, required=True) if action_name == "get": if gitlab.mixins.GetWithoutIdMixin not in inspect.getmro(cls): From 97dfe067513b0decafe5930cac06626f00d79db7 Mon Sep 17 00:00:00 2001 From: Eric Sabouraud Date: Mon, 11 Jun 2018 12:06:29 +0200 Subject: [PATCH 6/7] Update push rules doc --- docs/gl_objects/projects.rst | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/gl_objects/projects.rst b/docs/gl_objects/projects.rst index d3245f091..63ddba0b2 100644 --- a/docs/gl_objects/projects.rst +++ b/docs/gl_objects/projects.rst @@ -636,11 +636,19 @@ Reference Examples --------- -Get project push rules:: +Create project push rules (at least one rule is necessary):: + + project.pushrules.create({'deny_delete_tag': True}) + +Get project push rules (returns None is there are no push rules):: pr = project.pushrules.get() Edit project push rules:: pr.branch_name_regex = '^(master|develop|support-\d+|release-\d+\..+|hotfix-.+|feature-.+)$' - pr.save() + pr.save() + +Delete project push rules:: + + pr.delete() From b55957990a93f599c0afc1267bc7dcd4f26de8f3 Mon Sep 17 00:00:00 2001 From: Eric Sabouraud Date: Mon, 11 Jun 2018 14:12:33 +0200 Subject: [PATCH 7/7] Fix doc indent --- docs/gl_objects/projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/gl_objects/projects.rst b/docs/gl_objects/projects.rst index 63ddba0b2..a027cdd60 100644 --- a/docs/gl_objects/projects.rst +++ b/docs/gl_objects/projects.rst @@ -651,4 +651,4 @@ Edit project push rules:: Delete project push rules:: - pr.delete() + pr.delete()