Skip to content

Commit b46f370

Browse files
committed
feat(groups): add protectedbranches to group class (#3164)
1 parent af137ca commit b46f370

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

docs/gl_objects/protected_branches.rst

+9-4
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
Protected branches
33
##################
44

5-
You can define a list of protected branch names on a repository. Names can use
6-
wildcards (``*``).
5+
You can define a list of protected branch names on a repository or group.
6+
Names can use wildcards (``*``).
77

88
References
99
----------
@@ -13,19 +13,24 @@ References
1313
+ :class:`gitlab.v4.objects.ProjectProtectedBranch`
1414
+ :class:`gitlab.v4.objects.ProjectProtectedBranchManager`
1515
+ :attr:`gitlab.v4.objects.Project.protectedbranches`
16+
+ :class:`gitlab.v4.objects.GroupProtectedBranch`
17+
+ :class:`gitlab.v4.objects.GroupProtectedBranchManager`
18+
+ :attr:`gitlab.v4.objects.Group.protectedbranches`
1619

1720
* GitLab API: https://docs.gitlab.com/ce/api/protected_branches.html#protected-branches-api
1821

1922
Examples
2023
--------
2124

22-
Get the list of protected branches for a project::
25+
Get the list of protected branches for a project or group::
2326

24-
p_branches = project.protectedbranches.list(get_all=True)
27+
p_branches = project.protectedbranches.list()
28+
p_branches = group.protectedbranches.list()
2529

2630
Get a single protected branch::
2731

2832
p_branch = project.protectedbranches.get('main')
33+
p_branch = group.protectedbranches.get('main')
2934

3035
Update a protected branch::
3136

gitlab/v4/objects/branches.py

+24
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,27 @@ class ProjectProtectedBranchManager(CRUDMixin[ProjectProtectedBranch]):
4949
),
5050
)
5151
_update_method = UpdateMethod.PATCH
52+
53+
54+
class GroupProtectedBranch(SaveMixin, ObjectDeleteMixin, RESTObject):
55+
_id_attr = "name"
56+
57+
58+
class GroupProtectedBranchManager(CRUDMixin[GroupProtectedBranch]):
59+
_path = "/groups/{group_id}/protected_branches"
60+
_obj_cls = GroupProtectedBranch
61+
_from_parent_attrs = {"group_id": "id"}
62+
_create_attrs = RequiredOptional(
63+
required=("name",),
64+
optional=(
65+
"push_access_level",
66+
"merge_access_level",
67+
"unprotect_access_level",
68+
"allow_force_push",
69+
"allowed_to_push",
70+
"allowed_to_merge",
71+
"allowed_to_unprotect",
72+
"code_owner_approval_required",
73+
),
74+
)
75+
_update_method = UpdateMethod.PATCH

gitlab/v4/objects/groups.py

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from .audit_events import GroupAuditEventManager # noqa: F401
2525
from .badges import GroupBadgeManager # noqa: F401
2626
from .boards import GroupBoardManager # noqa: F401
27+
from .branches import GroupProtectedBranchManager # noqa: F401
2728
from .clusters import GroupClusterManager # noqa: F401
2829
from .container_registry import GroupRegistryRepositoryManager # noqa: F401
2930
from .custom_attributes import GroupCustomAttributeManager # noqa: F401
@@ -102,6 +103,7 @@ class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
102103
packages: GroupPackageManager
103104
projects: GroupProjectManager
104105
shared_projects: SharedProjectManager
106+
protectedbranches: GroupProtectedBranchManager
105107
pushrules: GroupPushRulesManager
106108
registry_repositories: GroupRegistryRepositoryManager
107109
runners: GroupRunnerManager

tests/functional/api/test_groups.py

+25
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,31 @@ def test_group_hooks(group):
312312
hook.delete()
313313

314314

315+
def test_group_protected_branches(group, gitlab_version):
316+
# Updating a protected branch at the group level is possible from Gitlab 15.9
317+
# https://docs.gitlab.com/api/group_protected_branches/
318+
can_update_prot_branch = gitlab_version.major > 15 or (
319+
gitlab_version.major == 15 and gitlab_version.minor >= 9
320+
)
321+
322+
p_b = group.protectedbranches.create(
323+
{"name": "*-stable", "allow_force_push": False}
324+
)
325+
assert p_b.name == "*-stable"
326+
assert not p_b.allow_force_push
327+
assert p_b in group.protectedbranches.list()
328+
329+
if can_update_prot_branch:
330+
p_b.allow_force_push = True
331+
p_b.save()
332+
333+
p_b = group.protectedbranches.get("*-stable")
334+
if can_update_prot_branch:
335+
assert p_b.allow_force_push
336+
337+
p_b.delete()
338+
339+
315340
def test_group_transfer(gl, group):
316341
transfer_group = gl.groups.create(
317342
{"name": "transfer-test-group", "path": "transfer-test-group"}

0 commit comments

Comments
 (0)