-
Notifications
You must be signed in to change notification settings - Fork 43
/
registry.go
81 lines (70 loc) 路 1.87 KB
/
registry.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
package registryV1
import (
"errors"
"fmt"
"runtime"
"sort"
"strings"
"github.com/Masterminds/semver/v3"
"github.com/go-semantic-release/semantic-release/v2/pkg/plugin"
"github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver"
)
const DefaultEndpoint = "https://plugins.go-semantic-release.xyz/api/v1"
var _ resolver.Resolver = &Resolver{}
type Resolver struct {
endpoint string
}
func NewResolver(endpoint string) *Resolver {
if endpoint == "" {
endpoint = DefaultEndpoint
}
endpoint = strings.TrimSuffix(endpoint, "/")
if !strings.HasSuffix(endpoint, "/api/v1") {
endpoint = fmt.Sprintf("%s/api/v1", endpoint)
}
return &Resolver{
endpoint: endpoint,
}
}
func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) {
pluginAPIRes, err := getPluginInfo(r.endpoint, pluginInfo.ShortNormalizedName)
if err != nil {
return nil, err
}
foundVersion := ""
if pluginInfo.Constraint == nil {
foundVersion = pluginAPIRes.LatestRelease
} else {
versions := make(semver.Collection, 0)
for v := range pluginAPIRes.Versions {
pv, err := semver.NewVersion(v)
if err != nil {
return nil, err
}
versions = append(versions, pv)
}
sort.Sort(sort.Reverse(versions))
for _, v := range versions {
if pluginInfo.Constraint.Check(v) {
foundVersion = v.String()
break
}
}
}
if foundVersion == "" {
return nil, errors.New("version not found")
}
releaseAsset := pluginAPIRes.Versions[foundVersion].getMatchingAsset()
if releaseAsset == nil {
return nil, fmt.Errorf("a matching plugin was not found for %s/%s", runtime.GOOS, runtime.GOARCH)
}
return &resolver.PluginDownloadInfo{
URL: releaseAsset.URL,
Checksum: releaseAsset.Checksum,
FileName: releaseAsset.FileName,
Version: foundVersion,
}, nil
}
func (r *Resolver) Names() []string {
return []string{"registry-v1"}
}