Commit fb691d7b authored by Juhani Ränkimies's avatar Juhani Ränkimies

Add support for Release links API

parent da49f84b
......@@ -322,6 +322,7 @@ type Client struct {
ProjectVariables *ProjectVariablesService
ProtectedBranches *ProtectedBranchesService
ProtectedTags *ProtectedTagsService
ReleaseLinks *ReleaseLinksService
Releases *ReleasesService
Repositories *RepositoriesService
RepositoryFiles *RepositoryFilesService
......@@ -464,6 +465,7 @@ func newClient(httpClient *http.Client) *Client {
c.ProjectVariables = &ProjectVariablesService{client: c}
c.ProtectedBranches = &ProtectedBranchesService{client: c}
c.ProtectedTags = &ProtectedTagsService{client: c}
c.ReleaseLinks = &ReleaseLinksService{client: c}
c.Releases = &ReleasesService{client: c}
c.Repositories = &RepositoriesService{client: c}
c.RepositoryFiles = &RepositoryFilesService{client: c}
......
package gitlab
import (
"fmt"
"net/url"
)
// ReleaseLinksService handles communication with the release link methods
// of the GitLab API.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html
type ReleaseLinksService struct {
client *Client
}
// ReleaseLink represents a release link.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html
type ReleaseLink struct {
ID int `json:"id"`
Name string `json:"name"`
URL string `json:"url"`
External bool `json:"external"`
}
// ListReleaseLinksOptions represents ListReleaseLinks() options.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#get-links
type ListReleaseLinksOptions ListOptions
// ListReleaseLinks gets assets as links from a Release.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#get-links
func (s *ReleaseLinksService) ListReleaseLinks(pid interface{}, tagName string, opt *ListReleaseLinksOptions, options ...OptionFunc) ([]*ReleaseLink, *Response, error) {
project, err := parseID(pid)
if err != nil {
return nil, nil, err
}
u := fmt.Sprintf("projects/%s/releases/%s/assets/links", url.QueryEscape(project), tagName)
req, err := s.client.NewRequest("GET", u, opt, options)
if err != nil {
return nil, nil, err
}
rls := make([]*ReleaseLink, 0)
resp, err := s.client.Do(req, &rls)
if err != nil {
return nil, resp, err
}
return rls, resp, err
}
// GetReleaseLink returns a link from release assets.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#get-a-link
func (s *ReleaseLinksService) GetReleaseLink(pid interface{}, tagName string, link int, options ...OptionFunc) (*ReleaseLink, *Response, error) {
project, err := parseID(pid)
if err != nil {
return nil, nil, err
}
u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d",
url.QueryEscape(project),
tagName,
link)
req, err := s.client.NewRequest("GET", u, nil, options)
if err != nil {
return nil, nil, err
}
rl := new(ReleaseLink)
resp, err := s.client.Do(req, rl)
if err != nil {
return nil, resp, err
}
return rl, resp, err
}
// CreateReleaseLinkOptions represents CreateReleaseLink() options.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#create-a-link
type CreateReleaseLinkOptions struct {
Name *string `url:"name" json:"name"`
URL *string `url:"url" json:"url"`
}
// CreateReleaseLink creates a link.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#create-a-link
func (s *ReleaseLinksService) CreateReleaseLink(pid interface{}, tagName string, opt *CreateReleaseLinkOptions, options ...OptionFunc) (*ReleaseLink, *Response, error) {
project, err := parseID(pid)
if err != nil {
return nil, nil, err
}
u := fmt.Sprintf("projects/%s/releases/%s/assets/links", url.QueryEscape(project), tagName)
req, err := s.client.NewRequest("POST", u, opt, options)
if err != nil {
return nil, nil, err
}
rl := new(ReleaseLink)
resp, err := s.client.Do(req, rl)
if err != nil {
return nil, resp, err
}
return rl, resp, err
}
// UpdateReleaseLinkOptions represents UpdateReleaseLink() options.
//
// You have to specify at least one of Name of URL.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#update-a-link
type UpdateReleaseLinkOptions struct {
Name *string `url:"name,omitempty" json:"name,omitempty"`
URL *string `url:"url,omitempty" json:"url,omitempty"`
}
// UpdateReleaseLink updates an asset link.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#update-a-link
func (s *ReleaseLinksService) UpdateReleaseLink(pid interface{}, tagName string, link int, opt *UpdateReleaseLinkOptions, options ...OptionFunc) (*ReleaseLink, *Response, error) {
project, err := parseID(pid)
if err != nil {
return nil, nil, err
}
u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d",
url.QueryEscape(project),
tagName,
link)
req, err := s.client.NewRequest("PUT", u, opt, options)
if err != nil {
return nil, nil, err
}
rl := new(ReleaseLink)
resp, err := s.client.Do(req, rl)
if err != nil {
return nil, resp, err
}
return rl, resp, err
}
// DeleteReleaseLink deletes a link from release.
//
// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#delete-a-link
func (s *ReleaseLinksService) DeleteReleaseLink(pid interface{}, tagName string, link int, options ...OptionFunc) (*ReleaseLink, *Response, error) {
project, err := parseID(pid)
if err != nil {
return nil, nil, err
}
u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d",
url.QueryEscape(project),
tagName,
link,
)
req, err := s.client.NewRequest("DELETE", u, nil, options)
if err != nil {
return nil, nil, err
}
rl := new(ReleaseLink)
resp, err := s.client.Do(req, rl)
if err != nil {
return nil, resp, err
}
return rl, resp, err
}
package gitlab
import (
"fmt"
"net/http"
"testing"
)
const exampleReleaseLinkList = `[
{
"id": 2,
"name": "awesome-v0.2.msi",
"url": "http://192.168.10.15:3000/msi",
"external": true
},
{
"id": 1,
"name": "awesome-v0.2.dmg",
"url": "http://192.168.10.15:3000",
"external": true
}
]`
func TestReleaseLinksService_ListReleaseLinks(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/1/releases/v0.1/assets/links",
func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, exampleReleaseLinkList)
})
releaseLinks, _, err := client.ReleaseLinks.ListReleaseLinks(
1, "v0.1", &ListReleaseLinksOptions{},
)
if err != nil {
t.Error(err)
}
if len(releaseLinks) != 2 {
t.Error("expected 2 links")
}
if releaseLinks[0].Name != "awesome-v0.2.msi" {
t.Errorf("release link name, expected '%s', got '%s'", "awesome-v0.2.msi",
releaseLinks[0].Name)
}
}
const exampleReleaseLink = `{
"id":1,
"name":"awesome-v0.2.dmg",
"url":"http://192.168.10.15:3000",
"external":true
}`
func TestReleaseLinksService_CreateReleaseLink(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/1/releases/v0.1/assets/links",
func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "POST")
fmt.Fprint(w, exampleReleaseLink)
})
releaseLink, _, err := client.ReleaseLinks.CreateReleaseLink(
1, "v0.1",
&CreateReleaseLinkOptions{
Name: String("awesome-v0.2.dmg"),
URL: String("http://192.168.10.15:3000"),
})
if err != nil {
t.Error(err)
}
if releaseLink.Name != "awesome-v0.2.dmg" {
t.Errorf("release link name, expected '%s', got '%s'", "awesome-v0.2.dmg",
releaseLink.Name)
}
}
func TestReleaseLinksService_GetReleaseLink(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/1/releases/v0.1/assets/links/1",
func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, exampleReleaseLink)
})
releaseLink, _, err := client.ReleaseLinks.GetReleaseLink(1, "v0.1", 1)
if err != nil {
t.Error(err)
}
if releaseLink.Name != "awesome-v0.2.dmg" {
t.Errorf("release link name, expected '%s', got '%s'", "awesome-v0.2.dmg",
releaseLink.Name)
}
}
func TestReleaseLinksService_UpdateReleaseLink(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/1/releases/v0.1/assets/links/1",
func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
fmt.Fprint(w, exampleReleaseLink)
})
releaseLink, _, err := client.ReleaseLinks.UpdateReleaseLink(
1, "v0.1", 1,
&UpdateReleaseLinkOptions{
Name: String("awesome-v0.2.dmg"),
})
if err != nil {
t.Error(err)
}
if releaseLink.Name != "awesome-v0.2.dmg" {
t.Errorf("release link name, expected '%s', got '%s'", "awesome-v0.2.dmg",
releaseLink.Name)
}
}
func TestReleaseLinksService_DeleteReleaseLink(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/1/releases/v0.1/assets/links/1",
func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "DELETE")
fmt.Fprint(w, exampleReleaseLink)
})
releaseLink, _, err := client.ReleaseLinks.DeleteReleaseLink(1, "v0.1", 1)
if err != nil {
t.Error(err)
}
if releaseLink.Name != "awesome-v0.2.dmg" {
t.Errorf("release link name, expected '%s', got '%s'", "awesome-v0.2.dmg",
releaseLink.Name)
}
}
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