forked from drone/go-scm
-
Notifications
You must be signed in to change notification settings - Fork 84
/
release.go
131 lines (116 loc) · 3.97 KB
/
release.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package github
import (
"context"
"fmt"
"time"
"github.com/jenkins-x/go-scm/scm"
)
type releaseService struct {
client *wrapper
}
type release struct {
ID int `json:"id"`
Title string `json:"name"`
Description string `json:"body"`
Link string `json:"html_url,omitempty"`
Tag string `json:"tag_name,omitempty"`
Commitish string `json:"target_commitish,omitempty"`
Draft bool `json:"draft"`
Prerelease bool `json:"prerelease"`
Created time.Time `json:"created_at"`
Published time.Time `json:"published_at"`
}
type releaseInput struct {
Title string `json:"name,omitempty"`
Description string `json:"body,omitempty"`
Tag string `json:"tag_name,omitempty"`
Commitish string `json:"target_commitish,omitempty"`
Draft bool `json:"draft"`
Prerelease bool `json:"prerelease"`
}
func (s *releaseService) Find(ctx context.Context, repo string, id int) (*scm.Release, *scm.Response, error) {
path := fmt.Sprintf("repos/%s/releases/%d", repo, id)
out := new(release)
res, err := s.client.do(ctx, "GET", path, nil, out)
return convertRelease(out), res, err
}
func (s *releaseService) FindByTag(ctx context.Context, repo, tag string) (*scm.Release, *scm.Response, error) {
path := fmt.Sprintf("repos/%s/releases/tags/%s", repo, tag)
out := new(release)
res, err := s.client.do(ctx, "GET", path, nil, out)
return convertRelease(out), res, err
}
func (s *releaseService) List(ctx context.Context, repo string, opts scm.ReleaseListOptions) ([]*scm.Release, *scm.Response, error) {
path := fmt.Sprintf("repos/%s/releases?%s", repo, encodeReleaseListOptions(opts))
out := []*release{}
res, err := s.client.do(ctx, "GET", path, nil, &out)
return convertReleaseList(out), res, err
}
func (s *releaseService) Create(ctx context.Context, repo string, input *scm.ReleaseInput) (*scm.Release, *scm.Response, error) {
path := fmt.Sprintf("repos/%s/releases", repo)
in := &releaseInput{
Title: input.Title,
Commitish: input.Commitish,
Description: input.Description,
Draft: input.Draft,
Prerelease: input.Prerelease,
Tag: input.Tag,
}
out := new(release)
res, err := s.client.do(ctx, "POST", path, in, out)
return convertRelease(out), res, err
}
func (s *releaseService) Delete(ctx context.Context, repo string, id int) (*scm.Response, error) {
path := fmt.Sprintf("repos/%s/releases/%d", repo, id)
return s.client.do(ctx, "DELETE", path, nil, nil)
}
func (s *releaseService) DeleteByTag(ctx context.Context, repo, tag string) (*scm.Response, error) {
rel, _, _ := s.FindByTag(ctx, repo, tag)
return s.Delete(ctx, repo, rel.ID)
}
func (s *releaseService) Update(ctx context.Context, repo string, id int, input *scm.ReleaseInput) (*scm.Release, *scm.Response, error) {
path := fmt.Sprintf("repos/%s/releases/%d", repo, id)
in := &releaseInput{}
if input.Title != "" {
in.Title = input.Title
}
if input.Description != "" {
in.Description = input.Description
}
if input.Commitish != "" {
in.Commitish = input.Commitish
}
if input.Tag != "" {
in.Tag = input.Tag
}
in.Draft = input.Draft
in.Prerelease = input.Prerelease
out := new(release)
res, err := s.client.do(ctx, "PATCH", path, in, out)
return convertRelease(out), res, err
}
func (s *releaseService) UpdateByTag(ctx context.Context, repo, tag string, input *scm.ReleaseInput) (*scm.Release, *scm.Response, error) {
rel, _, _ := s.FindByTag(ctx, repo, tag)
return s.Update(ctx, repo, rel.ID, input)
}
func convertReleaseList(from []*release) []*scm.Release {
var to []*scm.Release
for _, m := range from {
to = append(to, convertRelease(m))
}
return to
}
func convertRelease(from *release) *scm.Release {
return &scm.Release{
ID: from.ID,
Title: from.Title,
Description: from.Description,
Link: from.Link,
Tag: from.Tag,
Commitish: from.Commitish,
Draft: from.Draft,
Prerelease: from.Prerelease,
Created: from.Created,
Published: from.Published,
}
}