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  }