Skip to content

Commit d856572

Browse files
author
Raphaël Benitte
committed
Merge pull request #25 from gepo/mergerequests
Implement Merge Requests API
2 parents 27450b7 + 3a95d2a commit d856572

File tree

7 files changed

+547
-0
lines changed

7 files changed

+547
-0
lines changed

merge_requests.go

Lines changed: 331 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,331 @@
1+
package gogitlab
2+
3+
import (
4+
"encoding/json"
5+
"time"
6+
)
7+
8+
const (
9+
project_url_merge_requests = "/projects/:id/merge_requests" // Get project merge requests
10+
project_url_merge_request = "/projects/:id/merge_requests/:merge_request_id" // Get information about a single merge request
11+
project_url_merge_request_commits = "/projects/:id/merge_requests/:merge_request_id/commits" // Get a list of merge request commits
12+
project_url_merge_request_changes = "/projects/:id/merge_requests/:merge_request_id/changes" // Shows information about the merge request including its files and changes
13+
project_url_merge_request_merge = "/projects/:id/merge_requests/:merge_request_id/merge" // Merge changes submitted with MR
14+
project_url_merge_request_cancel_merge = "/projects/:id/merge_requests/:merge_request_id/cancel_merge_when_build_succeeds" // Cancel Merge When Build Succeeds
15+
project_url_merge_request_comments = "/projects/:id/merge_requests/:merge_request_id/comments" // Lists all comments associated with a merge request
16+
)
17+
18+
type MergeRequest struct {
19+
Id int `json:"id,omitempty"`
20+
Iid int `json:"iid,omitempty"`
21+
TargetBranch string `json:"target_branch,omitempty"`
22+
SourceBranch string `json:"source_branch,omitempty"`
23+
ProjectId int `json:"project_id,omitempty"`
24+
Title string `json:"title,omitempty"`
25+
State string `json:"state,omitempty"`
26+
Upvotes int `json:"upvotes,omitempty"`
27+
Downvotes int `json:"downvotes,omitempty"`
28+
Author *User `json:"author,omitempty"`
29+
Assignee *User `json:"assignee,omitempty"`
30+
Description string `json:"description,omitempty"`
31+
WorkInProgress bool `json:"work_in_progress,omitempty"`
32+
}
33+
34+
type ChangeItem struct {
35+
OldPath string `json:"old_path,omitempty"`
36+
NewPath string `json:"new_path,omitempty"`
37+
AMode string `json:"a_mode,omitempty"`
38+
BMode string `json:"b_mode,omitempty"`
39+
Diff string `json:"diff,omitempty"`
40+
NewFile bool `json:"new_file,omitempty"`
41+
RenamedFile bool `json:"renamed_file,omitempty"`
42+
DeletedFile bool `json:"deleted_file,omitempty"`
43+
}
44+
45+
type MergeRequestChanges struct {
46+
*MergeRequest
47+
CreatedAt string `json:"created_at,omitempty"`
48+
UpdatedAt string `json:"updated_at,omitempty"`
49+
SourceProjectId int `json:"source_project_id,omitempty"`
50+
TargetProjectId int `json:"target_project_id,omitempty"`
51+
Labels []string `json:"labels,omitempty"`
52+
Milestone Milestone `json:"milestone,omitempty"`
53+
Changes []ChangeItem `json:"changes,omitempty"`
54+
}
55+
56+
type AddMergeRequestRequest struct {
57+
SourceBranch string `json:"source_branch"`
58+
TargetBranch string `json:"target_branch"`
59+
AssigneeId int `json:"assignee_id,omitempty"`
60+
Title string `json:"title"`
61+
Description string `json:"description,omitempty"`
62+
TargetProjectId int `json:"target_project_id,omitempty"`
63+
Lables []string `json:"lables,omitempty"`
64+
}
65+
66+
type AcceptMergeRequestRequest struct {
67+
MergeCommitMessage string `json:"merge_commit_message,omitempty"`
68+
ShouldRemoveSourceBranch bool `json:"should_remove_source_branch,omitempty"`
69+
MergedWhenBuildSucceeds bool `json:"merged_when_build_succeeds,omitempty"`
70+
}
71+
72+
/*
73+
Get list of project merge requests.
74+
75+
GET /projects/:id/merge_requests
76+
77+
Parameters:
78+
79+
id The ID of a project
80+
81+
Params:
82+
iid (optional) - Return the request having the given iid
83+
state (optional) - Return all requests or just those that are merged, opened or closed
84+
order_by (optional) - Return requests ordered by created_at or updated_at fields. Default is created_at
85+
sort (optional) - Return requests sorted in asc or desc order. Default is desc
86+
87+
*/
88+
func (g *Gitlab) ProjectMergeRequests(id string, params map[string]string) ([]*MergeRequest, error) {
89+
url, opaque := g.ResourceUrlRaw(project_url_merge_requests, map[string]string{":id": id})
90+
91+
for name, value := range params {
92+
url = url + "&" + name + "=" + value
93+
}
94+
95+
var err error
96+
var mergeRequests []*MergeRequest
97+
98+
contents, err := g.buildAndExecRequestRaw("GET", url, opaque, nil)
99+
if err != nil {
100+
return mergeRequests, err
101+
}
102+
103+
err = json.Unmarshal(contents, &mergeRequests)
104+
105+
return mergeRequests, err
106+
}
107+
108+
/*
109+
Get single project merge request.
110+
111+
GET /projects/:id/merge_requests/:merge_request_id
112+
113+
Parameters:
114+
115+
id The ID of a project
116+
merge_request_id The ID of a merge request
117+
118+
*/
119+
func (g *Gitlab) ProjectMergeRequest(id, merge_request_id string) (*MergeRequest, error) {
120+
url, opaque := g.ResourceUrlRaw(project_url_merge_request, map[string]string{
121+
":id": id,
122+
":merge_request_id": merge_request_id,
123+
})
124+
125+
var err error
126+
mr := new(MergeRequest)
127+
128+
contents, err := g.buildAndExecRequestRaw("GET", url, opaque, nil)
129+
if err != nil {
130+
return mr, err
131+
}
132+
133+
err = json.Unmarshal(contents, &mr)
134+
135+
return mr, err
136+
}
137+
138+
/*
139+
Get a list of merge request commits.
140+
141+
GET /projects/:id/merge_request/:merge_request_id/commits
142+
143+
Parameters:
144+
145+
id The ID of a project
146+
merge_request_id The ID of a merge request
147+
148+
*/
149+
func (g *Gitlab) ProjectMergeRequestCommits(id, merge_request_id string) ([]*Commit, error) {
150+
url, opaque := g.ResourceUrlRaw(project_url_merge_request_commits, map[string]string{
151+
":id": id,
152+
":merge_request_id": merge_request_id,
153+
})
154+
155+
var err error
156+
var commits []*Commit
157+
158+
contents, err := g.buildAndExecRequestRaw("GET", url, opaque, nil)
159+
if err == nil {
160+
err = json.Unmarshal(contents, &commits)
161+
if err == nil {
162+
for _, commit := range commits {
163+
t, _ := time.Parse(dateLayout, commit.Created_At)
164+
commit.CreatedAt = t
165+
}
166+
}
167+
}
168+
169+
return commits, err
170+
}
171+
172+
/*
173+
Get information about the merge request including its files and changes.
174+
175+
GET /projects/:id/merge_request/:merge_request_id/changes
176+
177+
Parameters:
178+
179+
id The ID of a project
180+
merge_request_id The ID of a merge request
181+
182+
*/
183+
func (g *Gitlab) ProjectMergeRequestChanges(id, merge_request_id string) (*MergeRequestChanges, error) {
184+
url, opaque := g.ResourceUrlRaw(project_url_merge_request_changes, map[string]string{
185+
":id": id,
186+
":merge_request_id": merge_request_id,
187+
})
188+
189+
var err error
190+
changes := new(MergeRequestChanges)
191+
192+
contents, err := g.buildAndExecRequestRaw("GET", url, opaque, nil)
193+
if err != nil {
194+
return changes, err
195+
}
196+
197+
err = json.Unmarshal(contents, &changes)
198+
199+
return changes, err
200+
}
201+
202+
/*
203+
Creates a new merge request.
204+
205+
POST /projects/:id/merge_requests
206+
207+
Parameters:
208+
209+
id The ID of a project
210+
211+
*/
212+
func (g *Gitlab) AddMergeRequest(req *AddMergeRequestRequest) (*MergeRequest, error) {
213+
url, _ := g.ResourceUrlRaw(project_url_merge_requests, map[string]string{
214+
":id": string(req.TargetProjectId),
215+
})
216+
217+
encodedRequest, err := json.Marshal(req)
218+
if err != nil {
219+
return nil, err
220+
}
221+
222+
data, err := g.buildAndExecRequest("POST", url, encodedRequest)
223+
if err != nil {
224+
return nil, err
225+
}
226+
227+
mr := new(MergeRequest)
228+
err = json.Unmarshal(data, mr)
229+
if err != nil {
230+
panic(err)
231+
}
232+
return mr, nil
233+
}
234+
235+
/*
236+
Updates an existing merge request.
237+
238+
PUT /projects/:id/merge_request/:merge_request_id
239+
240+
Parameters:
241+
242+
id The ID of a project
243+
244+
*/
245+
func (g *Gitlab) EditMergeRequest(mr *MergeRequest) error {
246+
url, _ := g.ResourceUrlRaw(project_url_merge_request, map[string]string{
247+
":id": string(mr.ProjectId),
248+
":merge_request_id": string(mr.Id),
249+
})
250+
251+
encodedRequest, err := json.Marshal(mr)
252+
if err != nil {
253+
return err
254+
}
255+
256+
data, err := g.buildAndExecRequest("PUT", url, encodedRequest)
257+
if err != nil {
258+
return err
259+
}
260+
261+
err = json.Unmarshal(data, mr)
262+
if err != nil {
263+
panic(err)
264+
}
265+
return nil
266+
}
267+
268+
/*
269+
Merge changes submitted with MR.
270+
271+
PUT /projects/:id/merge_request/:merge_request_id/merge
272+
273+
Parameters:
274+
275+
id The ID of a project
276+
merge_request_id The ID of a merge request
277+
278+
*/
279+
func (g *Gitlab) ProjectMergeRequestAccept(id, merge_request_id string, req *AcceptMergeRequestRequest) (*MergeRequest, error) {
280+
url, _ := g.ResourceUrlRaw(project_url_merge_request_merge, map[string]string{
281+
":id": id,
282+
":merge_request_id": merge_request_id,
283+
})
284+
285+
encodedRequest, err := json.Marshal(req)
286+
if err != nil {
287+
return nil, err
288+
}
289+
290+
data, err := g.buildAndExecRequest("PUT", url, encodedRequest)
291+
if err != nil {
292+
return nil, err
293+
}
294+
295+
mr := new(MergeRequest)
296+
err = json.Unmarshal(data, mr)
297+
if err != nil {
298+
panic(err)
299+
}
300+
return mr, nil
301+
}
302+
303+
/*
304+
Cancel Merge When Build Succeeds.
305+
306+
PUT /projects/:id/merge_request/:merge_request_id/cancel_merge_when_build_succeeds
307+
308+
Parameters:
309+
310+
id The ID of a project
311+
merge_request_id The ID of a merge request
312+
313+
*/
314+
func (g *Gitlab) ProjectMergeRequestCancelMerge(id, merge_request_id string) (*MergeRequest, error) {
315+
url, _ := g.ResourceUrlRaw(project_url_merge_request_cancel_merge, map[string]string{
316+
":id": id,
317+
":merge_request_id": merge_request_id,
318+
})
319+
320+
data, err := g.buildAndExecRequest("PUT", url, []byte{})
321+
if err != nil {
322+
return nil, err
323+
}
324+
325+
mr := new(MergeRequest)
326+
err = json.Unmarshal(data, mr)
327+
if err != nil {
328+
panic(err)
329+
}
330+
return mr, nil
331+
}

0 commit comments

Comments
 (0)