-
Notifications
You must be signed in to change notification settings - Fork 43
/
registry.go
115 lines (103 loc) 路 3.15 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
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
package registry
import (
"context"
"fmt"
"runtime"
"sort"
"github.com/Masterminds/semver/v3"
"github.com/go-semantic-release/plugin-registry/pkg/client"
"github.com/go-semantic-release/plugin-registry/pkg/registry"
"github.com/go-semantic-release/semantic-release/v2/pkg/plugin"
"github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver"
)
type Resolver struct {
client *client.Client
}
func NewResolver(endpoint string) *Resolver {
if endpoint == "" {
endpoint = client.DefaultProductionEndpoint
}
return &Resolver{
client: client.New(endpoint),
}
}
func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) {
getPluginRes, err := r.client.GetPlugin(context.Background(), pluginInfo.ShortNormalizedName)
if err != nil {
return nil, err
}
osArch := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH)
if pluginInfo.Constraint == nil {
foundAsset := getPluginRes.LatestRelease.Assets[osArch]
if foundAsset == nil {
return nil, fmt.Errorf("a matching plugin was not found for %s/%s", runtime.GOOS, runtime.GOARCH)
}
return &resolver.PluginDownloadInfo{
URL: foundAsset.URL,
Checksum: foundAsset.Checksum,
FileName: foundAsset.FileName,
Version: getPluginRes.LatestRelease.Version,
}, nil
}
foundVersion := ""
versions := make(semver.Collection, 0)
for _, v := range getPluginRes.Versions {
pv, sErr := semver.NewVersion(v)
if sErr != nil {
return nil, sErr
}
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, fmt.Errorf("no matching version was found")
}
pluginRelease, err := r.client.GetPluginRelease(context.Background(), pluginInfo.ShortNormalizedName, foundVersion)
if err != nil {
return nil, err
}
foundAsset := pluginRelease.Assets[osArch]
if foundAsset == nil {
return nil, fmt.Errorf("a matching plugin was not found for %s/%s", runtime.GOOS, runtime.GOARCH)
}
return &resolver.PluginDownloadInfo{
URL: foundAsset.URL,
Checksum: foundAsset.Checksum,
FileName: foundAsset.FileName,
Version: getPluginRes.LatestRelease.Version,
}, nil
}
func (r *Resolver) BatchResolvePlugins(pluginInfos []*plugin.Info) (*resolver.BatchPluginDownloadInfo, error) {
batchRequest := ®istry.BatchRequest{
OS: runtime.GOOS,
Arch: runtime.GOARCH,
Plugins: make([]*registry.BatchRequestPlugin, len(pluginInfos)),
}
for i, pluginInfo := range pluginInfos {
versionConstraint := ""
if pluginInfo.Constraint != nil {
versionConstraint = pluginInfo.Constraint.String()
}
batchRequest.Plugins[i] = ®istry.BatchRequestPlugin{
FullName: pluginInfo.ShortNormalizedName,
VersionConstraint: versionConstraint,
}
}
batchResponse, err := r.client.SendBatchRequest(context.Background(), batchRequest)
if err != nil {
return nil, err
}
return &resolver.BatchPluginDownloadInfo{
URL: batchResponse.DownloadURL,
Checksum: batchResponse.DownloadChecksum,
}, nil
}
func (r *Resolver) Names() []string {
return []string{"registry", "registry-v2"}
}