9
9
from repo_manager .schemas .branch_protection import BranchProtection
10
10
from repo_manager .schemas .branch_protection import ProtectionOptions
11
11
from repo_manager .utils import attr_to_kwarg
12
-
12
+ from repo_manager . utils import objary_to_list
13
13
14
14
def diff_option (key : str , expected : Any , repo_value : Any ) -> str | None :
15
15
if expected is not None :
@@ -32,6 +32,8 @@ def edit_protection( # nosec
32
32
required_approving_review_count = NotSet ,
33
33
user_push_restrictions = NotSet ,
34
34
team_push_restrictions = NotSet ,
35
+ user_bypass_pull_request_allowances = NotSet ,
36
+ team_bypass_pull_request_allowances = NotSet ,
35
37
required_linear_history = NotSet ,
36
38
allow_force_pushes = NotSet ,
37
39
allow_deletions = NotSet ,
@@ -49,6 +51,8 @@ def edit_protection( # nosec
49
51
:required_approving_review_count: int
50
52
:user_push_restrictions: list of strings
51
53
:team_push_restrictions: list of strings
54
+ :user_bypass_pull_request_allowances: list of strings
55
+ :team_bypass_pull_request_allowances: list of strings
52
56
NOTE: The GitHub API groups strict and contexts together, both must
53
57
be submitted. Take care to pass both as arguments even if only one is
54
58
changing. Use edit_required_status_checks() to avoid this.
@@ -89,6 +93,8 @@ def edit_protection( # nosec
89
93
or dismiss_stale_reviews is not NotSet
90
94
or require_code_owner_reviews is not NotSet
91
95
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
92
98
):
93
99
post_parameters ["required_pull_request_reviews" ] = {}
94
100
if dismiss_stale_reviews is not NotSet :
@@ -101,12 +107,26 @@ def edit_protection( # nosec
101
107
post_parameters ["required_pull_request_reviews" ][
102
108
"required_approving_review_count"
103
109
] = 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
+ }
110
130
else :
111
131
post_parameters ["required_pull_request_reviews" ] = None
112
132
@@ -177,6 +197,18 @@ def edit_protection( # nosec
177
197
kwargs ,
178
198
transform_key = "dismissal_teams" ,
179
199
)
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
+ )
180
212
181
213
if repo .organization is not None :
182
214
attr_to_kwarg (
@@ -384,6 +416,31 @@ def check_repo_branch_protections(
384
416
)
385
417
386
418
# 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
+ )
387
444
388
445
diffs = [i for i in diffs if i is not None ]
389
446
if len (diffs ) > 0 :
0 commit comments