releases.go

  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}