Skip to content
Snippets Groups Projects
Commit 9e6e36ef authored by Christoph Witzko's avatar Christoph Witzko
Browse files

feat(registry): add single plugin fetching

parent 8e07b08e
Branches
Tags
No related merge requests found
...@@ -65,26 +65,69 @@ func (d *Discovery) fetchPlugin(pluginInfo *plugin.Info) (string, error) { ...@@ -65,26 +65,69 @@ func (d *Discovery) fetchPlugin(pluginInfo *plugin.Info) (string, error) {
return downloadPlugin(pluginInfo, downloadInfo, d.config.ShowProgress) return downloadPlugin(pluginInfo, downloadInfo, d.config.ShowProgress)
} }
func (d *Discovery) FindPlugin(t, name string) (*plugin.Info, error) { func (d *Discovery) IsBatchResolver(resolverName string) bool {
pInfo, err := plugin.GetPluginInfo(t, name) _, ok := d.resolvers[resolverName].(resolver.BatchResolver)
if err != nil { return ok
return nil, err
} }
err = setAndEnsurePluginPath(pInfo) func (d *Discovery) FindPluginByPluginInfo(pInfo *plugin.Info) error {
err := setAndEnsurePluginPath(pInfo)
if err != nil { if err != nil {
return nil, err return err
} }
binPath, err := findPluginLocally(pInfo) binPath, err := findPluginLocally(pInfo)
if errors.Is(err, ErrPluginNotFound) { if errors.Is(err, ErrPluginNotFound) {
binPath, err = d.fetchPlugin(pInfo) binPath, err = d.fetchPlugin(pInfo)
if err != nil { if err != nil {
return nil, err return err
} }
} else if err != nil { } else if err != nil {
return nil, err return err
} }
pInfo.BinPath = binPath pInfo.BinPath = binPath
return nil
}
func (d *Discovery) FindPlugin(t, name string) (*plugin.Info, error) {
pInfo, err := plugin.GetPluginInfo(t, name)
if err != nil {
return nil, err
}
err = d.FindPluginByPluginInfo(pInfo)
if err != nil {
return nil, err
}
return pInfo, nil return pInfo, nil
} }
func (d *Discovery) FindPluginsWithBatchResolver(resolverName string, pInfos []*plugin.Info) error {
if !d.IsBatchResolver(resolverName) {
return fmt.Errorf("resolver %s does not support batch resolving", resolverName)
}
missingPlugins := make([]*plugin.Info, 0)
for _, pInfo := range pInfos {
err := setAndEnsurePluginPath(pInfo)
if err != nil {
return err
}
binPath, err := findPluginLocally(pInfo)
if errors.Is(err, ErrPluginNotFound) {
missingPlugins = append(missingPlugins, pInfo)
continue
} else if err != nil {
return err
}
pInfo.BinPath = binPath
}
batchResolver := d.resolvers[resolverName].(resolver.BatchResolver)
batchDownloadInfo, err := batchResolver.BatchResolvePlugins(missingPlugins)
if err != nil {
return err
}
// TODO
_ = batchDownloadInfo
return nil
}
package registry package registry
import ( import (
"context"
"fmt" "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/client"
"github.com/go-semantic-release/semantic-release/v2/pkg/plugin" "github.com/go-semantic-release/semantic-release/v2/pkg/plugin"
"github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver" "github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver"
...@@ -21,6 +25,63 @@ func NewResolver() *Resolver { ...@@ -21,6 +25,63 @@ func NewResolver() *Resolver {
} }
func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) { 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) {
return nil, fmt.Errorf("not implemented") return nil, fmt.Errorf("not implemented")
} }
......
...@@ -18,7 +18,7 @@ func NewResolver() *Resolver { ...@@ -18,7 +18,7 @@ func NewResolver() *Resolver {
} }
func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) { func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) {
pluginAPIRes, err := getPluginInfo(pluginInfo.NormalizedName) pluginAPIRes, err := getPluginInfo(pluginInfo.ShortNormalizedName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -9,7 +9,16 @@ type PluginDownloadInfo struct { ...@@ -9,7 +9,16 @@ type PluginDownloadInfo struct {
Version string Version string
} }
type BatchPluginDownloadInfo struct {
URL string
Checksum string
}
type Resolver interface { type Resolver interface {
ResolvePlugin(*plugin.Info) (*PluginDownloadInfo, error) ResolvePlugin(*plugin.Info) (*PluginDownloadInfo, error)
Names() []string Names() []string
} }
type BatchResolver interface {
BatchResolvePlugins([]*plugin.Info) (*BatchPluginDownloadInfo, error)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment