github.com/google/go-github/v71@v71.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) (*BranchRules, *Response, error) {
    42  	u := fmt.Sprintf("repos/%v/%v/rules/branches/%v", owner, repo, branch)
    43  
    44  	req, err := s.client.NewRequest("GET", u, nil)
    45  	if err != nil {
    46  		return nil, nil, err
    47  	}
    48  
    49  	var rules *BranchRules
    50  	resp, err := s.client.Do(ctx, req, &rules)
    51  	if err != nil {
    52  		return nil, resp, err
    53  	}
    54  
    55  	return rules, resp, nil
    56  }
    57  
    58  // GetAllRulesets gets all the repository rulesets for the specified repository.
    59  // If includesParents is true, rulesets configured at the organization or enterprise level that apply to the repository will be returned.
    60  //
    61  // GitHub API docs: https://docs.github.com/rest/repos/rules#get-all-repository-rulesets
    62  //
    63  //meta:operation GET /repos/{owner}/{repo}/rulesets
    64  func (s *RepositoriesService) GetAllRulesets(ctx context.Context, owner, repo string, includesParents bool) ([]*RepositoryRuleset, *Response, error) {
    65  	u := fmt.Sprintf("repos/%v/%v/rulesets?includes_parents=%v", owner, repo, includesParents)
    66  
    67  	req, err := s.client.NewRequest("GET", u, nil)
    68  	if err != nil {
    69  		return nil, nil, err
    70  	}
    71  
    72  	var ruleset []*RepositoryRuleset
    73  	resp, err := s.client.Do(ctx, req, &ruleset)
    74  	if err != nil {
    75  		return nil, resp, err
    76  	}
    77  
    78  	return ruleset, resp, nil
    79  }
    80  
    81  // CreateRuleset creates a repository ruleset for the specified repository.
    82  //
    83  // GitHub API docs: https://docs.github.com/rest/repos/rules#create-a-repository-ruleset
    84  //
    85  //meta:operation POST /repos/{owner}/{repo}/rulesets
    86  func (s *RepositoriesService) CreateRuleset(ctx context.Context, owner, repo string, ruleset RepositoryRuleset) (*RepositoryRuleset, *Response, error) {
    87  	u := fmt.Sprintf("repos/%v/%v/rulesets", owner, repo)
    88  
    89  	req, err := s.client.NewRequest("POST", u, ruleset)
    90  	if err != nil {
    91  		return nil, nil, err
    92  	}
    93  
    94  	var rs *RepositoryRuleset
    95  	resp, err := s.client.Do(ctx, req, &rs)
    96  	if err != nil {
    97  		return nil, resp, err
    98  	}
    99  
   100  	return rs, resp, nil
   101  }
   102  
   103  // GetRuleset gets a repository ruleset for the specified repository.
   104  // If includesParents is true, rulesets configured at the organization or enterprise level that apply to the repository will be returned.
   105  //
   106  // GitHub API docs: https://docs.github.com/rest/repos/rules#get-a-repository-ruleset
   107  //
   108  //meta:operation GET /repos/{owner}/{repo}/rulesets/{ruleset_id}
   109  func (s *RepositoriesService) GetRuleset(ctx context.Context, owner, repo string, rulesetID int64, includesParents bool) (*RepositoryRuleset, *Response, error) {
   110  	u := fmt.Sprintf("repos/%v/%v/rulesets/%v?includes_parents=%v", owner, repo, rulesetID, includesParents)
   111  
   112  	req, err := s.client.NewRequest("GET", u, nil)
   113  	if err != nil {
   114  		return nil, nil, err
   115  	}
   116  
   117  	var ruleset *RepositoryRuleset
   118  	resp, err := s.client.Do(ctx, req, &ruleset)
   119  	if err != nil {
   120  		return nil, resp, err
   121  	}
   122  
   123  	return ruleset, resp, nil
   124  }
   125  
   126  // UpdateRuleset updates a repository ruleset for the specified repository.
   127  //
   128  // GitHub API docs: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset
   129  //
   130  //meta:operation PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}
   131  func (s *RepositoriesService) UpdateRuleset(ctx context.Context, owner, repo string, rulesetID int64, ruleset RepositoryRuleset) (*RepositoryRuleset, *Response, error) {
   132  	u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID)
   133  
   134  	req, err := s.client.NewRequest("PUT", u, ruleset)
   135  	if err != nil {
   136  		return nil, nil, err
   137  	}
   138  
   139  	var rs *RepositoryRuleset
   140  	resp, err := s.client.Do(ctx, req, &rs)
   141  	if err != nil {
   142  		return nil, resp, err
   143  	}
   144  
   145  	return rs, resp, nil
   146  }
   147  
   148  // UpdateRulesetClearBypassActor clears the bypass actors for a repository ruleset for the specified repository.
   149  //
   150  // This function is necessary as the UpdateRuleset function does not marshal ByPassActor if passed as an empty array.
   151  //
   152  // GitHub API docs: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset
   153  //
   154  //meta:operation PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}
   155  func (s *RepositoriesService) UpdateRulesetClearBypassActor(ctx context.Context, owner, repo string, rulesetID int64) (*Response, error) {
   156  	u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID)
   157  
   158  	rsClearBypassActor := rulesetClearBypassActors{}
   159  
   160  	req, err := s.client.NewRequest("PUT", u, rsClearBypassActor)
   161  	if err != nil {
   162  		return nil, err
   163  	}
   164  
   165  	resp, err := s.client.Do(ctx, req, nil)
   166  	if err != nil {
   167  		return resp, err
   168  	}
   169  
   170  	return resp, nil
   171  }
   172  
   173  // UpdateRulesetNoBypassActor updates a repository ruleset for the specified repository.
   174  //
   175  // This function is necessary as the UpdateRuleset function does not marshal ByPassActor if passed as an empty array.
   176  //
   177  // Deprecated: Use UpdateRulesetClearBypassActor instead.
   178  //
   179  // GitHub API docs: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset
   180  //
   181  //meta:operation PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}
   182  func (s *RepositoriesService) UpdateRulesetNoBypassActor(ctx context.Context, owner, repo string, rulesetID int64, ruleset RepositoryRuleset) (*RepositoryRuleset, *Response, error) {
   183  	u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID)
   184  
   185  	rsNoBypassActor := rulesetNoOmitBypassActors{
   186  		ID:           ruleset.ID,
   187  		Name:         ruleset.Name,
   188  		Target:       ruleset.Target,
   189  		SourceType:   ruleset.SourceType,
   190  		Source:       ruleset.Source,
   191  		Enforcement:  ruleset.Enforcement,
   192  		BypassActors: ruleset.BypassActors,
   193  		NodeID:       ruleset.NodeID,
   194  		Links:        ruleset.Links,
   195  		Conditions:   ruleset.Conditions,
   196  		Rules:        ruleset.Rules,
   197  	}
   198  
   199  	req, err := s.client.NewRequest("PUT", u, rsNoBypassActor)
   200  	if err != nil {
   201  		return nil, nil, err
   202  	}
   203  
   204  	var rs *RepositoryRuleset
   205  	resp, err := s.client.Do(ctx, req, &rs)
   206  	if err != nil {
   207  		return nil, resp, err
   208  	}
   209  
   210  	return rs, resp, nil
   211  }
   212  
   213  // DeleteRuleset deletes a repository ruleset for the specified repository.
   214  //
   215  // GitHub API docs: https://docs.github.com/rest/repos/rules#delete-a-repository-ruleset
   216  //
   217  //meta:operation DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}
   218  func (s *RepositoriesService) DeleteRuleset(ctx context.Context, owner, repo string, rulesetID int64) (*Response, error) {
   219  	u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID)
   220  
   221  	req, err := s.client.NewRequest("DELETE", u, nil)
   222  	if err != nil {
   223  		return nil, err
   224  	}
   225  
   226  	return s.client.Do(ctx, req, nil)
   227  }