mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-30 19:08:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			393 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			393 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package gitlab
 | ||
| 
 | ||
| import (
 | ||
| 	"fmt"
 | ||
| 	"time"
 | ||
| )
 | ||
| 
 | ||
| // MergeRequestApprovalsService handles communication with the merge request
 | ||
| // approvals related methods of the GitLab API. This includes reading/updating
 | ||
| // approval settings and approve/unapproving merge requests
 | ||
| //
 | ||
| // GitLab API docs: https://docs.gitlab.com/ee/api/merge_request_approvals.html
 | ||
| type MergeRequestApprovalsService struct {
 | ||
| 	client *Client
 | ||
| }
 | ||
| 
 | ||
| // MergeRequestApprovals represents GitLab merge request approvals.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#merge-request-level-mr-approvals
 | ||
| type MergeRequestApprovals struct {
 | ||
| 	ID                   int                          `json:"id"`
 | ||
| 	ProjectID            int                          `json:"project_id"`
 | ||
| 	Title                string                       `json:"title"`
 | ||
| 	Description          string                       `json:"description"`
 | ||
| 	State                string                       `json:"state"`
 | ||
| 	CreatedAt            *time.Time                   `json:"created_at"`
 | ||
| 	UpdatedAt            *time.Time                   `json:"updated_at"`
 | ||
| 	MergeStatus          string                       `json:"merge_status"`
 | ||
| 	ApprovalsBeforeMerge int                          `json:"approvals_before_merge"`
 | ||
| 	ApprovalsRequired    int                          `json:"approvals_required"`
 | ||
| 	ApprovalsLeft        int                          `json:"approvals_left"`
 | ||
| 	ApprovedBy           []*MergeRequestApproverUser  `json:"approved_by"`
 | ||
| 	Approvers            []*MergeRequestApproverUser  `json:"approvers"`
 | ||
| 	ApproverGroups       []*MergeRequestApproverGroup `json:"approver_groups"`
 | ||
| 	SuggestedApprovers   []*BasicUser                 `json:"suggested_approvers"`
 | ||
| }
 | ||
| 
 | ||
| func (m MergeRequestApprovals) String() string {
 | ||
| 	return Stringify(m)
 | ||
| }
 | ||
| 
 | ||
| // MergeRequestApproverGroup  represents GitLab project level merge request approver group.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals
 | ||
| type MergeRequestApproverGroup struct {
 | ||
| 	Group struct {
 | ||
| 		ID                   int    `json:"id"`
 | ||
| 		Name                 string `json:"name"`
 | ||
| 		Path                 string `json:"path"`
 | ||
| 		Description          string `json:"description"`
 | ||
| 		Visibility           string `json:"visibility"`
 | ||
| 		AvatarURL            string `json:"avatar_url"`
 | ||
| 		WebURL               string `json:"web_url"`
 | ||
| 		FullName             string `json:"full_name"`
 | ||
| 		FullPath             string `json:"full_path"`
 | ||
| 		LFSEnabled           bool   `json:"lfs_enabled"`
 | ||
| 		RequestAccessEnabled bool   `json:"request_access_enabled"`
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // MergeRequestApprovalRule represents a GitLab merge request approval rule.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-merge-request-level-rules
 | ||
| type MergeRequestApprovalRule struct {
 | ||
| 	ID                   int                  `json:"id"`
 | ||
| 	Name                 string               `json:"name"`
 | ||
| 	RuleType             string               `json:"rule_type"`
 | ||
| 	EligibleApprovers    []*BasicUser         `json:"eligible_approvers"`
 | ||
| 	ApprovalsRequired    int                  `json:"approvals_required"`
 | ||
| 	SourceRule           *ProjectApprovalRule `json:"source_rule"`
 | ||
| 	Users                []*BasicUser         `json:"users"`
 | ||
| 	Groups               []*Group             `json:"groups"`
 | ||
| 	ContainsHiddenGroups bool                 `json:"contains_hidden_groups"`
 | ||
| 	ApprovedBy           []*BasicUser         `json:"approved_by"`
 | ||
| 	Approved             bool                 `json:"approved"`
 | ||
| }
 | ||
| 
 | ||
| // MergeRequestApprovalState represents a GitLab merge request approval state.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-the-approval-state-of-merge-requests
 | ||
| type MergeRequestApprovalState struct {
 | ||
| 	ApprovalRulesOverwritten bool                        `json:"approval_rules_overwritten"`
 | ||
| 	Rules                    []*MergeRequestApprovalRule `json:"rules"`
 | ||
| }
 | ||
| 
 | ||
| // String is a stringify for MergeRequestApprovalRule
 | ||
| func (s MergeRequestApprovalRule) String() string {
 | ||
| 	return Stringify(s)
 | ||
| }
 | ||
| 
 | ||
| // MergeRequestApproverUser  represents GitLab project level merge request approver user.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals
 | ||
| type MergeRequestApproverUser struct {
 | ||
| 	User *BasicUser
 | ||
| }
 | ||
| 
 | ||
| // ApproveMergeRequestOptions represents the available ApproveMergeRequest() options.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request
 | ||
| type ApproveMergeRequestOptions struct {
 | ||
| 	SHA *string `url:"sha,omitempty" json:"sha,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // ApproveMergeRequest approves a merge request on GitLab. If a non-empty sha
 | ||
| // is provided then it must match the sha at the HEAD of the MR.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request
 | ||
| func (s *MergeRequestApprovalsService) ApproveMergeRequest(pid interface{}, mr int, opt *ApproveMergeRequestOptions, options ...RequestOptionFunc) (*MergeRequestApprovals, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approve", pathEscape(project), mr)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("POST", u, opt, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	m := new(MergeRequestApprovals)
 | ||
| 	resp, err := s.client.Do(req, m)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return m, resp, err
 | ||
| }
 | ||
| 
 | ||
| // UnapproveMergeRequest unapproves a previously approved merge request on GitLab.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#unapprove-merge-request
 | ||
| func (s *MergeRequestApprovalsService) UnapproveMergeRequest(pid interface{}, mr int, options ...RequestOptionFunc) (*Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/unapprove", pathEscape(project), mr)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("POST", u, nil, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return s.client.Do(req, nil)
 | ||
| }
 | ||
| 
 | ||
| // ChangeMergeRequestApprovalConfigurationOptions represents the available
 | ||
| // ChangeMergeRequestApprovalConfiguration() options.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-approval-configuration
 | ||
| type ChangeMergeRequestApprovalConfigurationOptions struct {
 | ||
| 	ApprovalsRequired *int `url:"approvals_required,omitempty" json:"approvals_required,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // GetConfiguration shows information about single merge request approvals
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-configuration-1
 | ||
| func (s *MergeRequestApprovalsService) GetConfiguration(pid interface{}, mr int, options ...RequestOptionFunc) (*MergeRequestApprovals, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approvals", pathEscape(project), mr)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("GET", u, nil, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	m := new(MergeRequestApprovals)
 | ||
| 	resp, err := s.client.Do(req, m)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return m, resp, err
 | ||
| }
 | ||
| 
 | ||
| // ChangeApprovalConfiguration updates the approval configuration of a merge request.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-approval-configuration
 | ||
| func (s *MergeRequestApprovalsService) ChangeApprovalConfiguration(pid interface{}, mergeRequest int, opt *ChangeMergeRequestApprovalConfigurationOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approvals", pathEscape(project), mergeRequest)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("POST", u, opt, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	m := new(MergeRequest)
 | ||
| 	resp, err := s.client.Do(req, m)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return m, resp, err
 | ||
| }
 | ||
| 
 | ||
| // ChangeMergeRequestAllowedApproversOptions represents the available
 | ||
| // ChangeMergeRequestAllowedApprovers() options.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers-for-merge-request
 | ||
| type ChangeMergeRequestAllowedApproversOptions struct {
 | ||
| 	ApproverIDs      []int `url:"approver_ids" json:"approver_ids"`
 | ||
| 	ApproverGroupIDs []int `url:"approver_group_ids" json:"approver_group_ids"`
 | ||
| }
 | ||
| 
 | ||
| // ChangeAllowedApprovers updates the approvers for a merge request.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers-for-merge-request
 | ||
| func (s *MergeRequestApprovalsService) ChangeAllowedApprovers(pid interface{}, mergeRequest int, opt *ChangeMergeRequestAllowedApproversOptions, options ...RequestOptionFunc) (*MergeRequest, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approvers", pathEscape(project), mergeRequest)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("PUT", u, opt, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	m := new(MergeRequest)
 | ||
| 	resp, err := s.client.Do(req, m)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return m, resp, err
 | ||
| }
 | ||
| 
 | ||
| // GetApprovalRules requests information about a merge request’s approval rules
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-merge-request-level-rules
 | ||
| func (s *MergeRequestApprovalsService) GetApprovalRules(pid interface{}, mergeRequest int, options ...RequestOptionFunc) ([]*MergeRequestApprovalRule, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules", pathEscape(project), mergeRequest)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("GET", u, nil, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	var par []*MergeRequestApprovalRule
 | ||
| 	resp, err := s.client.Do(req, &par)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return par, resp, err
 | ||
| }
 | ||
| 
 | ||
| // GetApprovalState requests information about a merge request’s approval state
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-the-approval-state-of-merge-requests
 | ||
| func (s *MergeRequestApprovalsService) GetApprovalState(pid interface{}, mergeRequest int, options ...RequestOptionFunc) (*MergeRequestApprovalState, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_state", pathEscape(project), mergeRequest)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("GET", u, nil, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	var pas *MergeRequestApprovalState
 | ||
| 	resp, err := s.client.Do(req, &pas)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return pas, resp, err
 | ||
| }
 | ||
| 
 | ||
| // CreateMergeRequestApprovalRuleOptions represents the available CreateApprovalRule()
 | ||
| // options.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-merge-request-level-rule
 | ||
| type CreateMergeRequestApprovalRuleOptions struct {
 | ||
| 	Name                  *string `url:"name,omitempty" json:"name,omitempty"`
 | ||
| 	ApprovalsRequired     *int    `url:"approvals_required,omitempty" json:"approvals_required,omitempty"`
 | ||
| 	ApprovalProjectRuleID *int    `url:"approval_project_rule_id,omitempty" json:"approval_project_rule_id,omitempty"`
 | ||
| 	UserIDs               []int   `url:"user_ids,omitempty" json:"user_ids,omitempty"`
 | ||
| 	GroupIDs              []int   `url:"group_ids,omitempty" json:"group_ids,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // CreateApprovalRule creates a new MR level approval rule.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-merge-request-level-rule
 | ||
| func (s *MergeRequestApprovalsService) CreateApprovalRule(pid interface{}, mergeRequest int, opt *CreateMergeRequestApprovalRuleOptions, options ...RequestOptionFunc) (*MergeRequestApprovalRule, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules", pathEscape(project), mergeRequest)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("POST", u, opt, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	par := new(MergeRequestApprovalRule)
 | ||
| 	resp, err := s.client.Do(req, &par)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return par, resp, err
 | ||
| }
 | ||
| 
 | ||
| // UpdateMergeRequestApprovalRuleOptions represents the available UpdateApprovalRule()
 | ||
| // options.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-merge-request-level-rule
 | ||
| type UpdateMergeRequestApprovalRuleOptions struct {
 | ||
| 	Name              *string `url:"name,omitempty" json:"name,omitempty"`
 | ||
| 	ApprovalsRequired *int    `url:"approvals_required,omitempty" json:"approvals_required,omitempty"`
 | ||
| 	UserIDs           []int   `url:"user_ids,omitempty" json:"user_ids,omitempty"`
 | ||
| 	GroupIDs          []int   `url:"group_ids,omitempty" json:"group_ids,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // UpdateApprovalRule updates an existing approval rule with new options.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-merge-request-level-rule
 | ||
| func (s *MergeRequestApprovalsService) UpdateApprovalRule(pid interface{}, mergeRequest int, approvalRule int, opt *UpdateMergeRequestApprovalRuleOptions, options ...RequestOptionFunc) (*MergeRequestApprovalRule, *Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules/%d", pathEscape(project), mergeRequest, approvalRule)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("PUT", u, opt, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	par := new(MergeRequestApprovalRule)
 | ||
| 	resp, err := s.client.Do(req, &par)
 | ||
| 	if err != nil {
 | ||
| 		return nil, resp, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return par, resp, err
 | ||
| }
 | ||
| 
 | ||
| // DeleteApprovalRule deletes a mr level approval rule.
 | ||
| //
 | ||
| // GitLab API docs:
 | ||
| // https://docs.gitlab.com/ee/api/merge_request_approvals.html#delete-merge-request-level-rule
 | ||
| func (s *MergeRequestApprovalsService) DeleteApprovalRule(pid interface{}, mergeRequest int, approvalRule int, options ...RequestOptionFunc) (*Response, error) {
 | ||
| 	project, err := parseID(pid)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 	u := fmt.Sprintf("projects/%s/merge_requests/%d/approval_rules/%d", pathEscape(project), mergeRequest, approvalRule)
 | ||
| 
 | ||
| 	req, err := s.client.NewRequest("DELETE", u, nil, options)
 | ||
| 	if err != nil {
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return s.client.Do(req, nil)
 | ||
| }
 |