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 ...@@ -47,7 +47,7 @@ to add new and/or missing endpoints. Currently the following services are suppor
- [x] Labels - [x] Labels
- [ ] License - [ ] License
- [x] Merge Requests - [x] Merge Requests
- [ ] Merge Request Approvals - [x] Merge Request Approvals
- [x] Project Milestones - [x] Project Milestones
- [ ] Group Milestones - [ ] Group Milestones
- [x] Namespaces - [x] Namespaces
......
...@@ -287,6 +287,7 @@ type Client struct { ...@@ -287,6 +287,7 @@ type Client struct {
Boards *IssueBoardsService Boards *IssueBoardsService
Labels *LabelsService Labels *LabelsService
MergeRequests *MergeRequestsService MergeRequests *MergeRequestsService
MergeRequestApprovals *MergeRequestApprovalsService
Milestones *MilestonesService Milestones *MilestonesService
Namespaces *NamespacesService Namespaces *NamespacesService
Notes *NotesService Notes *NotesService
...@@ -376,6 +377,7 @@ func newClient(httpClient *http.Client, tokenType tokenType, token string) *Clie ...@@ -376,6 +377,7 @@ func newClient(httpClient *http.Client, tokenType tokenType, token string) *Clie
c.Boards = &IssueBoardsService{client: c} c.Boards = &IssueBoardsService{client: c}
c.Labels = &LabelsService{client: c} c.Labels = &LabelsService{client: c}
c.MergeRequests = &MergeRequestsService{client: c, timeStats: timeStats} c.MergeRequests = &MergeRequestsService{client: c, timeStats: timeStats}
c.MergeRequestApprovals = &MergeRequestApprovalsService{client: c}
c.Milestones = &MilestonesService{client: c} c.Milestones = &MilestonesService{client: c}
c.Namespaces = &NamespacesService{client: c} c.Namespaces = &NamespacesService{client: c}
c.Notes = &NotesService{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 { ...@@ -111,37 +111,6 @@ func (m MergeRequest) String() string {
return Stringify(m) 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. // MergeRequestDiffVersion represents Gitlab merge request version.
// //
// Gitlab API docs: // 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