forked from linyows/git-semv
-
Notifications
You must be signed in to change notification settings - Fork 0
/
list.go
151 lines (129 loc) Β· 3.19 KB
/
list.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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package semv
import (
"strings"
"fmt"
"net/http"
"github.com/blang/semver"
"encoding/json"
"io/ioutil"
)
// TagCmd for tag list
var defaultVersion = "0.0.0"
// List struct
type List struct {
data semver.Versions
}
// GetList returns List
func GetList(url string) (*List, error) {
list, err := getVersions(url)
if err != nil {
return nil, err
}
return &List{data: list}, nil
}
// FindSimilar finds similar one
func (l *List) FindSimilar(v semver.Version) *Semv {
newSemv := &Semv{}
for _, vv := range l.data {
if vv.Major == v.Major && vv.Minor == v.Minor && vv.Patch == v.Patch {
newSemv = MustNew(vv.String())
}
}
return newSemv
}
// String to string
func (l *List) String() string {
var ll []string
for _, v := range l.data {
ll = append(ll, defaultTagPrefix+v.String())
}
return strings.Join(ll, "\n")
}
// Latest gets latest version from List
func (l *List) Latest() *Semv {
if l.data.Len() > 0 {
return &Semv{data: l.data[len(l.data)-1]}
}
return &Semv{data: semver.MustParse(defaultVersion)}
}
// WithoutPreRelease excludes pre-release
func (l *List) WithoutPreRelease() *List {
var list semver.Versions
for _, v := range l.data {
if len(v.Pre) > 0 {
continue
}
list = append(list, v)
}
return &List{data: list}
}
// OnlyPreRelease includes only pre-release
func (l *List) OnlyPreRelease() *List {
var list semver.Versions
for _, v := range l.data {
if len(v.Pre) == 0 {
continue
}
list = append(list, v)
}
return &List{data: list}
}
type Tags []struct {
Name string `json:"name"`
ZipballURL string `json:"zipball_url"`
TarballURL string `json:"tarball_url"`
Commit struct {
Sha string `json:"sha"`
URL string `json:"url"`
} `json:"commit"`
NodeID string `json:"node_id"`
}
func getContent(url string) ([]byte, error) {
client := http.Client{}
req , err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, fmt.Errorf("Cannot initiate http client: %v", err)
}
req.Header.Set("Accept", "application/vnd.github.v3+json")
resp , err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("GET error: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Status error: %v", resp.StatusCode)
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("Read body: %v", err)
}
return data, nil
}
// getVersions executes git tag as command
func getVersions(url string) (semver.Versions, error) {
body, err := getContent(url + "/tags")
if err != nil {
return nil, fmt.Errorf("Request error: %v", err)
}
var tags Tags
err = json.Unmarshal(body, &tags)
if err != nil {
return nil, fmt.Errorf("Cannot Unmarshal tags: %v", err)
}
var list semver.Versions
for i := 0; i < len(tags); i++ {
if defaultTagPrefix != "" {
trimmed := strings.TrimPrefix(tags[i].Name, defaultTagPrefix)
if trimmed == tags[i].Name {
continue
}
}
sv, err := semver.ParseTolerant(tags[i].Name)
if err != nil {
continue
}
list = append(list, sv)
}
semver.Sort(list)
return list, nil
}