Skip to content

Commit ef6dad4

Browse files
author
shiro
authored
feat(new_bp_comparisons): New Branch Protection Comparisons previously omitted (#43)
* feat(branch_protections.py): Added Bypass Pull request Added the comparisons for users and teams with special privileges' as well as ability to set the ones who can bypass pull requests * feat(__init__.py): Function objary_to_list Can now create a list of an attribute from an attribute on the objects in another list or array
1 parent c4a164d commit ef6dad4

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

repo_manager/github/branch_protections.py

+64-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from repo_manager.schemas.branch_protection import BranchProtection
1010
from repo_manager.schemas.branch_protection import ProtectionOptions
1111
from repo_manager.utils import attr_to_kwarg
12-
12+
from repo_manager.utils import objary_to_list
1313

1414
def diff_option(key: str, expected: Any, repo_value: Any) -> str | None:
1515
if expected is not None:
@@ -32,6 +32,8 @@ def edit_protection( # nosec
3232
required_approving_review_count=NotSet,
3333
user_push_restrictions=NotSet,
3434
team_push_restrictions=NotSet,
35+
user_bypass_pull_request_allowances=NotSet,
36+
team_bypass_pull_request_allowances=NotSet,
3537
required_linear_history=NotSet,
3638
allow_force_pushes=NotSet,
3739
allow_deletions=NotSet,
@@ -49,6 +51,8 @@ def edit_protection( # nosec
4951
:required_approving_review_count: int
5052
:user_push_restrictions: list of strings
5153
:team_push_restrictions: list of strings
54+
:user_bypass_pull_request_allowances: list of strings
55+
:team_bypass_pull_request_allowances: list of strings
5256
NOTE: The GitHub API groups strict and contexts together, both must
5357
be submitted. Take care to pass both as arguments even if only one is
5458
changing. Use edit_required_status_checks() to avoid this.
@@ -89,6 +93,8 @@ def edit_protection( # nosec
8993
or dismiss_stale_reviews is not NotSet
9094
or require_code_owner_reviews is not NotSet
9195
or required_approving_review_count is not NotSet
96+
or user_bypass_pull_request_allowances is not NotSet
97+
or team_bypass_pull_request_allowances is not NotSet
9298
):
9399
post_parameters["required_pull_request_reviews"] = {}
94100
if dismiss_stale_reviews is not NotSet:
@@ -101,12 +107,26 @@ def edit_protection( # nosec
101107
post_parameters["required_pull_request_reviews"][
102108
"required_approving_review_count"
103109
] = required_approving_review_count
104-
if dismissal_users is not NotSet:
105-
post_parameters["required_pull_request_reviews"]["dismissal_restrictions"] = {"users": dismissal_users}
106-
if dismissal_teams is not NotSet:
107-
if "dismissal_restrictions" not in post_parameters["required_pull_request_reviews"]:
108-
post_parameters["required_pull_request_reviews"]["dismissal_restrictions"] = {}
109-
post_parameters["required_pull_request_reviews"]["dismissal_restrictions"]["teams"] = dismissal_teams
110+
if dismissal_users is not NotSet or dismissal_teams is not NotSet:
111+
if dismissal_users is NotSet:
112+
dismissal_teams = []
113+
if dismissal_teams is NotSet:
114+
dismissal_teams = []
115+
post_parameters["required_pull_request_reviews"]["dismissal_restrictions"] \
116+
= {
117+
"users": dismissal_users,
118+
"teams": dismissal_teams,
119+
}
120+
if user_bypass_pull_request_allowances is not NotSet or team_bypass_pull_request_allowances is not NotSet:
121+
if user_bypass_pull_request_allowances is NotSet:
122+
user_bypass_pull_request_allowances = []
123+
if team_bypass_pull_request_allowances is NotSet:
124+
team_bypass_pull_request_allowances = []
125+
post_parameters["required_pull_request_reviews"]["bypass_pull_request_allowances"] \
126+
= {
127+
"users": user_bypass_pull_request_allowances,
128+
"teams": team_bypass_pull_request_allowances,
129+
}
110130
else:
111131
post_parameters["required_pull_request_reviews"] = None
112132

@@ -177,6 +197,18 @@ def edit_protection( # nosec
177197
kwargs,
178198
transform_key="dismissal_teams",
179199
)
200+
attr_to_kwarg(
201+
"users",
202+
protection_config.pr_options.dismissal_restrictions,
203+
kwargs,
204+
transform_key="user_bypass_pull_request_allowances",
205+
)
206+
attr_to_kwarg(
207+
"teams",
208+
protection_config.pr_options.dismissal_restrictions,
209+
kwargs,
210+
transform_key="team_bypass_pull_request_allowances",
211+
)
180212

181213
if repo.organization is not None:
182214
attr_to_kwarg(
@@ -384,6 +416,31 @@ def check_repo_branch_protections(
384416
)
385417

386418
# TODO: Figure out how to diff Restriction options
419+
# I figured out some of them....
420+
dismissal_teams = [] if (this_protection.required_pull_request_reviews is None) else \
421+
objary_to_list("slug", this_protection.required_pull_request_reviews.dismissal_teams)
422+
dismissal_teams.sort()
423+
if (config_bp.protection.pr_options.dismissal_restrictions.teams is not None):
424+
config_bp.protection.pr_options.dismissal_restrictions.teams.sort()
425+
diffs.append(
426+
diff_option(
427+
"dismissal_teams",
428+
config_bp.protection.pr_options.dismissal_restrictions.teams,
429+
dismissal_teams,
430+
)
431+
)
432+
dismissal_users = [] if (this_protection.required_pull_request_reviews is None) else \
433+
objary_to_list("name", this_protection.required_pull_request_reviews.dismissal_users)
434+
dismissal_users.sort()
435+
if (config_bp.protection.pr_options.dismissal_restrictions.teams is not None):
436+
config_bp.protection.pr_options.dismissal_restrictions.teams.sort()
437+
diffs.append(
438+
diff_option(
439+
"dismissal_users",
440+
config_bp.protection.pr_options.dismissal_restrictions.users,
441+
dismissal_users,
442+
)
443+
)
387444

388445
diffs = [i for i in diffs if i is not None]
389446
if len(diffs) > 0:

repo_manager/utils/__init__.py

+7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44
from actions_toolkit import core as actions_toolkit
55

6+
# Needed to handle extracting certain attributes/fields from nested objects and lists
7+
from itertools import repeat
8+
69
from repo_manager.github import get_github_client
710

811
from ._inputs import INPUTS
@@ -104,3 +107,7 @@ def attr_to_kwarg(attr_name: str, obj: Any, kwargs: dict, transform_key: str = N
104107
kwargs[attr_name] = value
105108
else:
106109
kwargs[transform_key] = value
110+
111+
# Allows use to extract a certain field on a list of objects into a list of strings etc.
112+
def objary_to_list(attr_name: str, obj: Any):
113+
return list(map(getattr, obj, repeat(attr_name)))

0 commit comments

Comments
 (0)