Commit c675fc56 authored by Zaq? Wiedmann's avatar Zaq? Wiedmann Committed by Sander van Harmelen

(merge_request_approvals) add support for un/approving merge requests (#386)

parent 3c94cb66
......@@ -47,7 +47,7 @@ to add new and/or missing endpoints. Currently the following services are suppor
- [x] Labels
- [ ] License
- [x] Merge Requests
- [ ] Merge Request Approvals
- [x] Merge Request Approvals
- [x] Project Milestones
- [ ] Group Milestones
- [x] Namespaces
......
......@@ -267,54 +267,55 @@ type Client struct {
UserAgent string
// Services used for talking to different parts of the GitLab API.
AwardEmoji *AwardEmojiService
Branches *BranchesService
BuildVariables *BuildVariablesService
BroadcastMessage *BroadcastMessagesService
Commits *CommitsService
DeployKeys *DeployKeysService
Deployments *DeploymentsService
Environments *EnvironmentsService
Events *EventsService
Features *FeaturesService
GitIgnoreTemplates *GitIgnoreTemplatesService
Groups *GroupsService
GroupMembers *GroupMembersService
GroupMilestones *GroupMilestonesService
Issues *IssuesService
IssueLinks *IssueLinksService
Jobs *JobsService
Boards *IssueBoardsService
Labels *LabelsService
MergeRequests *MergeRequestsService
Milestones *MilestonesService
Namespaces *NamespacesService
Notes *NotesService
NotificationSettings *NotificationSettingsService
PagesDomains *PagesDomainsService
Pipelines *PipelinesService
PipelineSchedules *PipelineSchedulesService
PipelineTriggers *PipelineTriggersService
Projects *ProjectsService
ProjectMembers *ProjectMembersService
ProjectSnippets *ProjectSnippetsService
ProtectedBranches *ProtectedBranchesService
Repositories *RepositoriesService
RepositoryFiles *RepositoryFilesService
Runners *RunnersService
Search *SearchService
Services *ServicesService
Session *SessionService
Settings *SettingsService
Sidekiq *SidekiqService
Snippets *SnippetsService
SystemHooks *SystemHooksService
Tags *TagsService
Todos *TodosService
Users *UsersService
Validate *ValidateService
Version *VersionService
Wikis *WikisService
AwardEmoji *AwardEmojiService
Branches *BranchesService
BuildVariables *BuildVariablesService
BroadcastMessage *BroadcastMessagesService
Commits *CommitsService
DeployKeys *DeployKeysService
Deployments *DeploymentsService
Environments *EnvironmentsService
Events *EventsService
Features *FeaturesService
GitIgnoreTemplates *GitIgnoreTemplatesService
Groups *GroupsService
GroupMembers *GroupMembersService
GroupMilestones *GroupMilestonesService
Issues *IssuesService
IssueLinks *IssueLinksService
Jobs *JobsService
Boards *IssueBoardsService
Labels *LabelsService
MergeRequests *MergeRequestsService
MergeRequestApprovals *MergeRequestApprovalsService
Milestones *MilestonesService
Namespaces *NamespacesService
Notes *NotesService
NotificationSettings *NotificationSettingsService
PagesDomains *PagesDomainsService
Pipelines *PipelinesService
PipelineSchedules *PipelineSchedulesService
PipelineTriggers *PipelineTriggersService
Projects *ProjectsService
ProjectMembers *ProjectMembersService
ProjectSnippets *ProjectSnippetsService
ProtectedBranches *ProtectedBranchesService
Repositories *RepositoriesService
RepositoryFiles *RepositoryFilesService
Runners *RunnersService
Search *SearchService
Services *ServicesService
Session *SessionService
Settings *SettingsService
Sidekiq *SidekiqService
Snippets *SnippetsService
SystemHooks *SystemHooksService
Tags *TagsService
Todos *TodosService
Users *UsersService
Validate *ValidateService
Version *VersionService
Wikis *WikisService
}
// ListOptions specifies the optional parameters to various List methods that
......@@ -376,6 +377,7 @@ func newClient(httpClient *http.Client, tokenType tokenType, token string) *Clie
c.Boards = &IssueBoardsService{client: c}
c.Labels = &LabelsService{client: c}
c.MergeRequests = &MergeRequestsService{client: c, timeStats: timeStats}
c.MergeRequestApprovals = &MergeRequestApprovalsService{client: c}
c.Milestones = &MilestonesService{client: c}
c.Namespaces = &NamespacesService{client: c}
c.Notes = &NotesService{client: c}
......
package gitlab
import (
"fmt"
"net/url"
"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"`
ApprovalsRequired int `json:"approvals_required"`
ApprovalsLeft int `json:"approvals_left"`
ApprovedBy []struct {
User struct {
ID int `json:"id"`
Name string `json:"name"`
Username string `json:"username"`
State string `json:"state"`
AvatarURL string `json:"avatar_url"`
WebURL string `json:"web_url"`
} `json:"user"`
} `json:"approved_by"`
ApproverGroups []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"`
} `json:"group"`
} `json:"approver_group"`
}
func (m MergeRequestApprovals) String() string {
return Stringify(m)
}
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{}, mrID int, opt *ApproveMergeRequestOptions, options ...OptionFunc) (*MergeRequestApprovals, *Response, error) {
project, err := parseID(pid)
if err != nil {
return nil, nil, err
}
u := fmt.Sprintf("projects/%s/merge_requests/%d/approve", url.QueryEscape(project), mrID)
req, err := s.client.NewRequest("GET", 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 ...OptionFunc) (*Response, error) {
project, err := parseID(pid)
if err != nil {
return nil, err
}
u := fmt.Sprintf("projects/%s/merge_requests/%d/unapprove", url.QueryEscape(project), mr)
req, err := s.client.NewRequest("GET", u, nil, options)
if err != nil {
return nil, err
}
return s.client.Do(req, nil)
}
......@@ -111,37 +111,6 @@ func (m MergeRequest) String() string {
return Stringify(m)
}
// 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"`
ApprovalsRequired int `json:"approvals_required"`
ApprovalsLeft int `json:"approvals_left"`
ApprovedBy []struct {
User struct {
Name string `json:"name"`
Username string `json:"username"`
ID int `json:"id"`
State string `json:"state"`
AvatarURL string `json:"avatar_url"`
WebURL string `json:"web_url"`
} `json:"user"`
} `json:"approved_by"`
}
func (m MergeRequestApprovals) String() string {
return Stringify(m)
}
// MergeRequestDiffVersion represents Gitlab merge request version.
//
// Gitlab API docs:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment