1package gitlab 2 3import ( 4 "fmt" 5 "time" 6) 7 8// ReleasesService handles communication with the releases methods 9// of the GitLab API. 10// 11// GitLab API docs: https://docs.gitlab.com/ce/api/releases/index.html 12type ReleasesService struct { 13 client *Client 14} 15 16// Release represents a project release. 17// 18// GitLab API docs: 19// https://docs.gitlab.com/ce/api/releases/index.html#list-releases 20type Release struct { 21 TagName string `json:"tag_name"` 22 Name string `json:"name"` 23 Description string `json:"description,omitempty"` 24 DescriptionHTML string `json:"description_html,omitempty"` 25 CreatedAt *time.Time `json:"created_at,omitempty"` 26 Author struct { 27 ID int `json:"id"` 28 Name string `json:"name"` 29 Username string `json:"username"` 30 State string `json:"state"` 31 AvatarURL string `json:"avatar_url"` 32 WebURL string `json:"web_url"` 33 } `json:"author"` 34 Commit Commit `json:"commit"` 35 Assets struct { 36 Count int `json:"count"` 37 Sources []struct { 38 Format string `json:"format"` 39 URL string `json:"url"` 40 } `json:"sources"` 41 Links []*ReleaseLink `json:"links"` 42 } `json:"assets"` 43} 44 45// ListReleasesOptions represents ListReleases() options. 46// 47// GitLab API docs: 48// https://docs.gitlab.com/ce/api/releases/index.html#list-releases 49type ListReleasesOptions ListOptions 50 51// ListReleases gets a pagenated of releases accessible by the authenticated user. 52// 53// GitLab API docs: 54// https://docs.gitlab.com/ce/api/releases/index.html#list-releases 55func (s *ReleasesService) ListReleases(pid interface{}, opt *ListReleasesOptions, options ...OptionFunc) ([]*Release, *Response, error) { 56 project, err := parseID(pid) 57 if err != nil { 58 return nil, nil, err 59 } 60 u := fmt.Sprintf("projects/%s/releases", pathEscape(project)) 61 62 req, err := s.client.NewRequest("GET", u, opt, options) 63 if err != nil { 64 return nil, nil, err 65 } 66 67 var rs []*Release 68 resp, err := s.client.Do(req, &rs) 69 if err != nil { 70 return nil, resp, err 71 } 72 73 return rs, resp, err 74} 75 76// GetRelease returns a single release, identified by a tag name. 77// 78// GitLab API docs: 79// https://docs.gitlab.com/ce/api/releases/index.html#get-a-release-by-a-tag-name 80func (s *ReleasesService) GetRelease(pid interface{}, tagName string, options ...OptionFunc) (*Release, *Response, error) { 81 project, err := parseID(pid) 82 if err != nil { 83 return nil, nil, err 84 } 85 u := fmt.Sprintf("projects/%s/releases/%s", pathEscape(project), tagName) 86 87 req, err := s.client.NewRequest("GET", u, nil, options) 88 if err != nil { 89 return nil, nil, err 90 } 91 92 r := new(Release) 93 resp, err := s.client.Do(req, r) 94 if err != nil { 95 return nil, resp, err 96 } 97 98 return r, resp, err 99} 100 101// ReleaseAssets represents release assets in CreateRelease() options 102// 103// GitLab API docs: 104// https://docs.gitlab.com/ce/api/releases/index.html#create-a-release 105type ReleaseAssets struct { 106 Links []*ReleaseAssetLink `url:"links" json:"links"` 107} 108 109// ReleaseAssetLink represents release asset link in CreateRelease() options 110// 111// GitLab API docs: 112// https://docs.gitlab.com/ce/api/releases/index.html#create-a-release 113type ReleaseAssetLink struct { 114 Name string `url:"name" json:"name"` 115 URL string `url:"url" json:"url"` 116} 117 118// CreateReleaseOptions represents CreateRelease() options. 119// 120// GitLab API docs: 121// https://docs.gitlab.com/ce/api/releases/index.html#create-a-release 122type CreateReleaseOptions struct { 123 Name *string `url:"name" json:"name"` 124 TagName *string `url:"tag_name" json:"tag_name"` 125 Description *string `url:"description" json:"description"` 126 Ref *string `url:"ref,omitempty" json:"ref,omitempty"` 127 Assets *ReleaseAssets `url:"assets,omitempty" json:"assets,omitempty"` 128} 129 130// CreateRelease creates a release. 131// 132// GitLab API docs: 133// https://docs.gitlab.com/ce/api/releases/index.html#create-a-release 134func (s *ReleasesService) CreateRelease(pid interface{}, opts *CreateReleaseOptions, options ...OptionFunc) (*Release, *Response, error) { 135 project, err := parseID(pid) 136 if err != nil { 137 return nil, nil, err 138 } 139 u := fmt.Sprintf("projects/%s/releases", pathEscape(project)) 140 141 req, err := s.client.NewRequest("POST", u, opts, options) 142 if err != nil { 143 return nil, nil, err 144 } 145 146 r := new(Release) 147 resp, err := s.client.Do(req, r) 148 if err != nil { 149 return nil, resp, err 150 } 151 152 return r, resp, err 153} 154 155// UpdateReleaseOptions represents UpdateRelease() options. 156// 157// GitLab API docs: 158// https://docs.gitlab.com/ce/api/releases/index.html#update-a-release 159type UpdateReleaseOptions struct { 160 Name *string `url:"name" json:"name"` 161 Description *string `url:"description" json:"description"` 162} 163 164// UpdateRelease updates a release. 165// 166// GitLab API docs: 167// https://docs.gitlab.com/ce/api/releases/index.html#update-a-release 168func (s *ReleasesService) UpdateRelease(pid interface{}, tagName string, opts *UpdateReleaseOptions, options ...OptionFunc) (*Release, *Response, error) { 169 project, err := parseID(pid) 170 if err != nil { 171 return nil, nil, err 172 } 173 u := fmt.Sprintf("projects/%s/releases/%s", pathEscape(project), tagName) 174 175 req, err := s.client.NewRequest("PUT", u, opts, options) 176 if err != nil { 177 return nil, nil, err 178 } 179 180 r := new(Release) 181 resp, err := s.client.Do(req, &r) 182 if err != nil { 183 return nil, resp, err 184 } 185 186 return r, resp, err 187} 188 189// DeleteRelease deletes a release. 190// 191// GitLab API docs: 192// https://docs.gitlab.com/ce/api/releases/index.html#delete-a-release 193func (s *ReleasesService) DeleteRelease(pid interface{}, tagName string, options ...OptionFunc) (*Release, *Response, error) { 194 project, err := parseID(pid) 195 if err != nil { 196 return nil, nil, err 197 } 198 u := fmt.Sprintf("projects/%s/releases/%s", pathEscape(project), tagName) 199 200 req, err := s.client.NewRequest("DELETE", u, nil, options) 201 if err != nil { 202 return nil, nil, err 203 } 204 205 r := new(Release) 206 resp, err := s.client.Do(req, r) 207 if err != nil { 208 return nil, resp, err 209 } 210 211 return r, resp, err 212} 213