1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package gitlab
18
19 import (
20 "fmt"
21 "net/http"
22 "time"
23 )
24
25
26
27
28
29 type ReleasesService struct {
30 client *Client
31 }
32
33
34
35
36
37 type Release struct {
38 TagName string `json:"tag_name"`
39 Name string `json:"name"`
40 Description string `json:"description"`
41 DescriptionHTML string `json:"description_html"`
42 CreatedAt *time.Time `json:"created_at"`
43 ReleasedAt *time.Time `json:"released_at"`
44 Author struct {
45 ID int `json:"id"`
46 Name string `json:"name"`
47 Username string `json:"username"`
48 State string `json:"state"`
49 AvatarURL string `json:"avatar_url"`
50 WebURL string `json:"web_url"`
51 } `json:"author"`
52 Commit Commit `json:"commit"`
53 UpcomingRelease bool `json:"upcoming_release"`
54 CommitPath string `json:"commit_path"`
55 TagPath string `json:"tag_path"`
56 Assets struct {
57 Count int `json:"count"`
58 Sources []struct {
59 Format string `json:"format"`
60 URL string `json:"url"`
61 } `json:"sources"`
62 Links []*ReleaseLink `json:"links"`
63 } `json:"assets"`
64 Links struct {
65 ClosedIssueURL string `json:"closed_issues_url"`
66 ClosedMergeRequest string `json:"closed_merge_requests_url"`
67 EditURL string `json:"edit_url"`
68 MergedMergeRequest string `json:"merged_merge_requests_url"`
69 OpenedIssues string `json:"opened_issues_url"`
70 OpenedMergeRequest string `json:"opened_merge_requests_url"`
71 Self string `json:"self"`
72 } `json:"_links"`
73 }
74
75
76
77
78
79 type ListReleasesOptions struct {
80 ListOptions
81 OrderBy *string `url:"order_by,omitempty" json:"order_by,omitempty"`
82 Sort *string `url:"sort,omitempty" json:"sort,omitempty"`
83 IncludeHTMLDescription *bool `url:"include_html_description,omitempty" json:"include_html_description,omitempty"`
84 }
85
86
87
88
89
90 func (s *ReleasesService) ListReleases(pid interface{}, opt *ListReleasesOptions, options ...RequestOptionFunc) ([]*Release, *Response, error) {
91 project, err := parseID(pid)
92 if err != nil {
93 return nil, nil, err
94 }
95 u := fmt.Sprintf("projects/%s/releases", PathEscape(project))
96
97 req, err := s.client.NewRequest(http.MethodGet, u, opt, options)
98 if err != nil {
99 return nil, nil, err
100 }
101
102 var rs []*Release
103 resp, err := s.client.Do(req, &rs)
104 if err != nil {
105 return nil, resp, err
106 }
107
108 return rs, resp, nil
109 }
110
111
112
113
114
115 func (s *ReleasesService) GetRelease(pid interface{}, tagName string, options ...RequestOptionFunc) (*Release, *Response, error) {
116 project, err := parseID(pid)
117 if err != nil {
118 return nil, nil, err
119 }
120 u := fmt.Sprintf("projects/%s/releases/%s", PathEscape(project), PathEscape(tagName))
121
122 req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
123 if err != nil {
124 return nil, nil, err
125 }
126
127 r := new(Release)
128 resp, err := s.client.Do(req, r)
129 if err != nil {
130 return nil, resp, err
131 }
132
133 return r, resp, nil
134 }
135
136
137
138
139
140 func (s *ReleasesService) GetLatestRelease(pid interface{}, options ...RequestOptionFunc) (*Release, *Response, error) {
141 project, err := parseID(pid)
142 if err != nil {
143 return nil, nil, err
144 }
145 u := fmt.Sprintf("projects/%s/releases/permalink/latest", PathEscape(project))
146
147 req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
148 if err != nil {
149 return nil, nil, err
150 }
151
152 r := new(Release)
153 resp, err := s.client.Do(req, r)
154 if err != nil {
155 return nil, resp, err
156 }
157
158 return r, resp, err
159 }
160
161
162
163
164
165 type CreateReleaseOptions struct {
166 Name *string `url:"name,omitempty" json:"name,omitempty"`
167 TagName *string `url:"tag_name,omitempty" json:"tag_name,omitempty"`
168 TagMessage *string `url:"tag_message,omitempty" json:"tag_message,omitempty"`
169 Description *string `url:"description,omitempty" json:"description,omitempty"`
170 Ref *string `url:"ref,omitempty" json:"ref,omitempty"`
171 Milestones *[]string `url:"milestones,omitempty" json:"milestones,omitempty"`
172 Assets *ReleaseAssetsOptions `url:"assets,omitempty" json:"assets,omitempty"`
173 ReleasedAt *time.Time `url:"released_at,omitempty" json:"released_at,omitempty"`
174 }
175
176
177
178
179
180 type ReleaseAssetsOptions struct {
181 Links []*ReleaseAssetLinkOptions `url:"links,omitempty" json:"links,omitempty"`
182 }
183
184
185
186
187
188
189 type ReleaseAssetLinkOptions struct {
190 Name *string `url:"name,omitempty" json:"name,omitempty"`
191 URL *string `url:"url,omitempty" json:"url,omitempty"`
192 FilePath *string `url:"filepath,omitempty" json:"filepath,omitempty"`
193 LinkType *LinkTypeValue `url:"link_type,omitempty" json:"link_type,omitempty"`
194 }
195
196
197
198
199
200 func (s *ReleasesService) CreateRelease(pid interface{}, opts *CreateReleaseOptions, options ...RequestOptionFunc) (*Release, *Response, error) {
201 project, err := parseID(pid)
202 if err != nil {
203 return nil, nil, err
204 }
205 u := fmt.Sprintf("projects/%s/releases", PathEscape(project))
206
207 req, err := s.client.NewRequest(http.MethodPost, u, opts, options)
208 if err != nil {
209 return nil, nil, err
210 }
211
212 r := new(Release)
213 resp, err := s.client.Do(req, r)
214 if err != nil {
215 return nil, resp, err
216 }
217
218 return r, resp, nil
219 }
220
221
222
223
224
225 type UpdateReleaseOptions struct {
226 Name *string `url:"name" json:"name"`
227 Description *string `url:"description" json:"description"`
228 Milestones *[]string `url:"milestones,omitempty" json:"milestones,omitempty"`
229 ReleasedAt *time.Time `url:"released_at,omitempty" json:"released_at,omitempty"`
230 }
231
232
233
234
235
236 func (s *ReleasesService) UpdateRelease(pid interface{}, tagName string, opts *UpdateReleaseOptions, options ...RequestOptionFunc) (*Release, *Response, error) {
237 project, err := parseID(pid)
238 if err != nil {
239 return nil, nil, err
240 }
241 u := fmt.Sprintf("projects/%s/releases/%s", PathEscape(project), PathEscape(tagName))
242
243 req, err := s.client.NewRequest(http.MethodPut, u, opts, options)
244 if err != nil {
245 return nil, nil, err
246 }
247
248 r := new(Release)
249 resp, err := s.client.Do(req, &r)
250 if err != nil {
251 return nil, resp, err
252 }
253
254 return r, resp, nil
255 }
256
257
258
259
260
261 func (s *ReleasesService) DeleteRelease(pid interface{}, tagName string, options ...RequestOptionFunc) (*Release, *Response, error) {
262 project, err := parseID(pid)
263 if err != nil {
264 return nil, nil, err
265 }
266 u := fmt.Sprintf("projects/%s/releases/%s", PathEscape(project), PathEscape(tagName))
267
268 req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
269 if err != nil {
270 return nil, nil, err
271 }
272
273 r := new(Release)
274 resp, err := s.client.Do(req, r)
275 if err != nil {
276 return nil, resp, err
277 }
278
279 return r, resp, nil
280 }
281
View as plain text