github.com/google/go-github/v74@v74.0.0/github/repos_rules.go (about) 1 // Copyright 2023 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "context" 10 "fmt" 11 ) 12 13 // rulesetNoOmitBypassActors represents a GitHub ruleset object. The struct does not omit bypassActors if the field is nil or an empty array is passed. 14 type rulesetNoOmitBypassActors struct { 15 ID *int64 `json:"id,omitempty"` 16 Name string `json:"name"` 17 Target *RulesetTarget `json:"target,omitempty"` 18 SourceType *RulesetSourceType `json:"source_type,omitempty"` 19 Source string `json:"source"` 20 Enforcement RulesetEnforcement `json:"enforcement"` 21 BypassActors []*BypassActor `json:"bypass_actors"` 22 CurrentUserCanBypass *BypassMode `json:"current_user_can_bypass,omitempty"` 23 NodeID *string `json:"node_id,omitempty"` 24 Links *RepositoryRulesetLinks `json:"_links,omitempty"` 25 Conditions *RepositoryRulesetConditions `json:"conditions,omitempty"` 26 Rules *RepositoryRulesetRules `json:"rules,omitempty"` 27 UpdatedAt *Timestamp `json:"updated_at,omitempty"` 28 CreatedAt *Timestamp `json:"created_at,omitempty"` 29 } 30 31 // rulesetClearBypassActors is used to clear the bypass actors when modifying a GitHub ruleset object. 32 type rulesetClearBypassActors struct { 33 BypassActors []*BypassActor `json:"bypass_actors"` 34 } 35 36 // GetRulesForBranch gets all the repository rules that apply to the specified branch. 37 // 38 // GitHub API docs: https://docs.github.com/rest/repos/rules#get-rules-for-a-branch 39 // 40 //meta:operation GET /repos/{owner}/{repo}/rules/branches/{branch} 41 func (s *RepositoriesService) GetRulesForBranch(ctx context.Context, owner, repo, branch string, opts *ListOptions) (*BranchRules, *Response, error) { 42 u := fmt.Sprintf("repos/%v/%v/rules/branches/%v", owner, repo, branch) 43 44 u, err := addOptions(u, opts) 45 if err != nil { 46 return nil, nil, err 47 } 48 49 req, err := s.client.NewRequest("GET", u, nil) 50 if err != nil { 51 return nil, nil, err 52 } 53 54 var rules *BranchRules 55 resp, err := s.client.Do(ctx, req, &rules) 56 if err != nil { 57 return nil, resp, err 58 } 59 60 return rules, resp, nil 61 } 62 63 // RepositoryListRulesetsOptions specifies optional parameters to the 64 // RepositoriesService.GetAllRulesets method. 65 type RepositoryListRulesetsOptions struct { 66 // IncludesParents indicates whether to include rulesets configured at the organization or enterprise level that apply to the repository. 67 IncludesParents *bool `url:"includes_parents,omitempty"` 68 ListOptions 69 } 70 71 // GetAllRulesets gets all the repository rulesets for the specified repository. 72 // By default, this endpoint will include rulesets configured at the organization or enterprise level that apply to the repository. 73 // To exclude those rulesets, set the `RepositoryListRulesetsOptions.IncludesParents` parameter to `false`. 74 // 75 // GitHub API docs: https://docs.github.com/rest/repos/rules#get-all-repository-rulesets 76 // 77 //meta:operation GET /repos/{owner}/{repo}/rulesets 78 func (s *RepositoriesService) GetAllRulesets(ctx context.Context, owner, repo string, opts *RepositoryListRulesetsOptions) ([]*RepositoryRuleset, *Response, error) { 79 u := fmt.Sprintf("repos/%v/%v/rulesets", owner, repo) 80 81 u, err := addOptions(u, opts) 82 if err != nil { 83 return nil, nil, err 84 } 85 86 req, err := s.client.NewRequest("GET", u, nil) 87 if err != nil { 88 return nil, nil, err 89 } 90 91 var ruleset []*RepositoryRuleset 92 resp, err := s.client.Do(ctx, req, &ruleset) 93 if err != nil { 94 return nil, resp, err 95 } 96 97 return ruleset, resp, nil 98 } 99 100 // CreateRuleset creates a repository ruleset for the specified repository. 101 // 102 // GitHub API docs: https://docs.github.com/rest/repos/rules#create-a-repository-ruleset 103 // 104 //meta:operation POST /repos/{owner}/{repo}/rulesets 105 func (s *RepositoriesService) CreateRuleset(ctx context.Context, owner, repo string, ruleset RepositoryRuleset) (*RepositoryRuleset, *Response, error) { 106 u := fmt.Sprintf("repos/%v/%v/rulesets", owner, repo) 107 108 req, err := s.client.NewRequest("POST", u, ruleset) 109 if err != nil { 110 return nil, nil, err 111 } 112 113 var rs *RepositoryRuleset 114 resp, err := s.client.Do(ctx, req, &rs) 115 if err != nil { 116 return nil, resp, err 117 } 118 119 return rs, resp, nil 120 } 121 122 // GetRuleset gets a repository ruleset for the specified repository. 123 // If includesParents is true, rulesets configured at the organization or enterprise level that apply to the repository will be returned. 124 // 125 // GitHub API docs: https://docs.github.com/rest/repos/rules#get-a-repository-ruleset 126 // 127 //meta:operation GET /repos/{owner}/{repo}/rulesets/{ruleset_id} 128 func (s *RepositoriesService) GetRuleset(ctx context.Context, owner, repo string, rulesetID int64, includesParents bool) (*RepositoryRuleset, *Response, error) { 129 u := fmt.Sprintf("repos/%v/%v/rulesets/%v?includes_parents=%v", owner, repo, rulesetID, includesParents) 130 131 req, err := s.client.NewRequest("GET", u, nil) 132 if err != nil { 133 return nil, nil, err 134 } 135 136 var ruleset *RepositoryRuleset 137 resp, err := s.client.Do(ctx, req, &ruleset) 138 if err != nil { 139 return nil, resp, err 140 } 141 142 return ruleset, resp, nil 143 } 144 145 // UpdateRuleset updates a repository ruleset for the specified repository. 146 // 147 // GitHub API docs: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset 148 // 149 //meta:operation PUT /repos/{owner}/{repo}/rulesets/{ruleset_id} 150 func (s *RepositoriesService) UpdateRuleset(ctx context.Context, owner, repo string, rulesetID int64, ruleset RepositoryRuleset) (*RepositoryRuleset, *Response, error) { 151 u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID) 152 153 req, err := s.client.NewRequest("PUT", u, ruleset) 154 if err != nil { 155 return nil, nil, err 156 } 157 158 var rs *RepositoryRuleset 159 resp, err := s.client.Do(ctx, req, &rs) 160 if err != nil { 161 return nil, resp, err 162 } 163 164 return rs, resp, nil 165 } 166 167 // UpdateRulesetClearBypassActor clears the bypass actors for a repository ruleset for the specified repository. 168 // 169 // This function is necessary as the UpdateRuleset function does not marshal ByPassActor if passed as an empty array. 170 // 171 // GitHub API docs: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset 172 // 173 //meta:operation PUT /repos/{owner}/{repo}/rulesets/{ruleset_id} 174 func (s *RepositoriesService) UpdateRulesetClearBypassActor(ctx context.Context, owner, repo string, rulesetID int64) (*Response, error) { 175 u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID) 176 177 rsClearBypassActor := rulesetClearBypassActors{} 178 179 req, err := s.client.NewRequest("PUT", u, rsClearBypassActor) 180 if err != nil { 181 return nil, err 182 } 183 184 resp, err := s.client.Do(ctx, req, nil) 185 if err != nil { 186 return resp, err 187 } 188 189 return resp, nil 190 } 191 192 // UpdateRulesetNoBypassActor updates a repository ruleset for the specified repository. 193 // 194 // This function is necessary as the UpdateRuleset function does not marshal ByPassActor if passed as an empty array. 195 // 196 // Deprecated: Use UpdateRulesetClearBypassActor instead. 197 // 198 // GitHub API docs: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset 199 // 200 //meta:operation PUT /repos/{owner}/{repo}/rulesets/{ruleset_id} 201 func (s *RepositoriesService) UpdateRulesetNoBypassActor(ctx context.Context, owner, repo string, rulesetID int64, ruleset RepositoryRuleset) (*RepositoryRuleset, *Response, error) { 202 u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID) 203 204 rsNoBypassActor := rulesetNoOmitBypassActors{ 205 ID: ruleset.ID, 206 Name: ruleset.Name, 207 Target: ruleset.Target, 208 SourceType: ruleset.SourceType, 209 Source: ruleset.Source, 210 Enforcement: ruleset.Enforcement, 211 BypassActors: ruleset.BypassActors, 212 NodeID: ruleset.NodeID, 213 Links: ruleset.Links, 214 Conditions: ruleset.Conditions, 215 Rules: ruleset.Rules, 216 } 217 218 req, err := s.client.NewRequest("PUT", u, rsNoBypassActor) 219 if err != nil { 220 return nil, nil, err 221 } 222 223 var rs *RepositoryRuleset 224 resp, err := s.client.Do(ctx, req, &rs) 225 if err != nil { 226 return nil, resp, err 227 } 228 229 return rs, resp, nil 230 } 231 232 // DeleteRuleset deletes a repository ruleset for the specified repository. 233 // 234 // GitHub API docs: https://docs.github.com/rest/repos/rules#delete-a-repository-ruleset 235 // 236 //meta:operation DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id} 237 func (s *RepositoriesService) DeleteRuleset(ctx context.Context, owner, repo string, rulesetID int64) (*Response, error) { 238 u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID) 239 240 req, err := s.client.NewRequest("DELETE", u, nil) 241 if err != nil { 242 return nil, err 243 } 244 245 return s.client.Do(ctx, req, nil) 246 }