Skip to content

Commit

Permalink
feat(registry): add single plugin fetching
Browse files Browse the repository at this point in the history
  • Loading branch information
christophwitzko committed Feb 4, 2023
1 parent 8e07b08 commit 9e6e36e
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 10 deletions.
61 changes: 52 additions & 9 deletions pkg/plugin/discovery/discovery.go
Expand Up @@ -65,26 +65,69 @@ func (d *Discovery) fetchPlugin(pluginInfo *plugin.Info) (string, error) {
return downloadPlugin(pluginInfo, downloadInfo, d.config.ShowProgress)
}

func (d *Discovery) FindPlugin(t, name string) (*plugin.Info, error) {
pInfo, err := plugin.GetPluginInfo(t, name)
if err != nil {
return nil, err
}
func (d *Discovery) IsBatchResolver(resolverName string) bool {
_, ok := d.resolvers[resolverName].(resolver.BatchResolver)
return ok
}

err = setAndEnsurePluginPath(pInfo)
func (d *Discovery) FindPluginByPluginInfo(pInfo *plugin.Info) error {
err := setAndEnsurePluginPath(pInfo)
if err != nil {
return nil, err
return err
}

binPath, err := findPluginLocally(pInfo)
if errors.Is(err, ErrPluginNotFound) {
binPath, err = d.fetchPlugin(pInfo)
if err != nil {
return nil, err
return err
}
} else if err != nil {
return nil, err
return err
}
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
}

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
}
61 changes: 61 additions & 0 deletions pkg/plugin/discovery/resolver/registry/registry.go
@@ -1,8 +1,12 @@
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/semantic-release/v2/pkg/plugin"
"github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver"
Expand All @@ -21,6 +25,63 @@ func NewResolver() *Resolver {
}

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")
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/plugin/discovery/resolver/registryV1/registry.go
Expand Up @@ -18,7 +18,7 @@ func NewResolver() *Resolver {
}

func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) {
pluginAPIRes, err := getPluginInfo(pluginInfo.NormalizedName)
pluginAPIRes, err := getPluginInfo(pluginInfo.ShortNormalizedName)
if err != nil {
return nil, err
}
Expand Down
9 changes: 9 additions & 0 deletions pkg/plugin/discovery/resolver/resolver.go
Expand Up @@ -9,7 +9,16 @@ type PluginDownloadInfo struct {
Version string
}

type BatchPluginDownloadInfo struct {
URL string
Checksum string
}

type Resolver interface {
ResolvePlugin(*plugin.Info) (*PluginDownloadInfo, error)
Names() []string
}

type BatchResolver interface {
BatchResolvePlugins([]*plugin.Info) (*BatchPluginDownloadInfo, error)
}

0 comments on commit 9e6e36e

Please sign in to comment.