diff --git a/pkg/plugin/discovery/discovery.go b/pkg/plugin/discovery/discovery.go index e6cd48e0a7140e793fa9fc74f9fe1aa11e5f2692..496debe246a83213e496f72c61bdce9e2de53c78 100644 --- a/pkg/plugin/discovery/discovery.go +++ b/pkg/plugin/discovery/discovery.go @@ -9,6 +9,7 @@ import ( "github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver" "github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver/github" "github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver/registry" + "github.com/go-semantic-release/semantic-release/v2/pkg/plugin/discovery/resolver/registryV1" ) type Discovery struct { @@ -33,7 +34,7 @@ func loadResolvers(resolvers ...resolver.Resolver) (map[string]resolver.Resolver } func New(config *config.Config) (*Discovery, error) { - resolvers, err := loadResolvers(registry.NewResolver(), github.NewResolver()) + resolvers, err := loadResolvers(registryV1.NewResolver(), github.NewResolver(), registry.NewResolver()) if err != nil { return nil, err } diff --git a/pkg/plugin/discovery/resolver/registry/registry.go b/pkg/plugin/discovery/resolver/registry/registry.go index 85faccf1abaaa2f7e90d7b2af7666f75013308dc..6e28c08bbb21aafd363d83b283eef900c23ac868 100644 --- a/pkg/plugin/discovery/resolver/registry/registry.go +++ b/pkg/plugin/discovery/resolver/registry/registry.go @@ -1,65 +1,30 @@ package registry import ( - "errors" "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" ) -type Resolver struct{} +const DefaultEndpoint = "https://registry-staging.go-semantic-release.xyz/api/v2" -func NewResolver() *Resolver { - return &Resolver{} +type Resolver struct { + client *client.Client } -func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) { - pluginAPIRes, err := getPluginInfo(pluginInfo.NormalizedName) - 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") +func NewResolver() *Resolver { + return &Resolver{ + client: client.New(DefaultEndpoint), } +} - 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) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) { + return nil, fmt.Errorf("not implemented") } func (r *Resolver) Names() []string { - return []string{"registry"} + // TODO: this should be registry when the registry is ready + return []string{"registry-beta"} } diff --git a/pkg/plugin/discovery/resolver/registry/api.go b/pkg/plugin/discovery/resolver/registryV1/api.go similarity index 98% rename from pkg/plugin/discovery/resolver/registry/api.go rename to pkg/plugin/discovery/resolver/registryV1/api.go index 29812b6b52cec6b3b323cf584c35cbc28d40b3fa..7ece18b2be663a62c1f259220debc40f902f80df 100644 --- a/pkg/plugin/discovery/resolver/registry/api.go +++ b/pkg/plugin/discovery/resolver/registryV1/api.go @@ -1,4 +1,4 @@ -package registry +package registryV1 import ( "encoding/json" diff --git a/pkg/plugin/discovery/resolver/registryV1/registry.go b/pkg/plugin/discovery/resolver/registryV1/registry.go new file mode 100644 index 0000000000000000000000000000000000000000..470ae66f2aa156c831bbc2fd4ecc4c911be2ed72 --- /dev/null +++ b/pkg/plugin/discovery/resolver/registryV1/registry.go @@ -0,0 +1,65 @@ +package registryV1 + +import ( + "errors" + "fmt" + "runtime" + "sort" + + "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" +) + +type Resolver struct{} + +func NewResolver() *Resolver { + return &Resolver{} +} + +func (r *Resolver) ResolvePlugin(pluginInfo *plugin.Info) (*resolver.PluginDownloadInfo, error) { + pluginAPIRes, err := getPluginInfo(pluginInfo.NormalizedName) + 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"} +} diff --git a/pkg/plugin/manager/manager.go b/pkg/plugin/manager/manager.go index cf8aae719e600e8ed5d4ae7cacb1d49f042dcb44..042e0837f216ecda48d100b197ad6036c79097e6 100644 --- a/pkg/plugin/manager/manager.go +++ b/pkg/plugin/manager/manager.go @@ -124,29 +124,27 @@ func (m *PluginManager) Stop() { plugin.KillAllPlugins() } -func (m *PluginManager) FetchAllPlugins() error { - pluginMap := map[string]string{ - condition.CIConditionPluginName: m.config.CIConditionPlugin, - provider.PluginName: m.config.ProviderPlugin, - analyzer.CommitAnalyzerPluginName: m.config.CommitAnalyzerPlugin, - generator.ChangelogGeneratorPluginName: m.config.ChangelogGeneratorPlugin, - } - for t, name := range pluginMap { - _, err := m.discovery.FindPlugin(t, name) - if err != nil { - return err - } - } - +func (m *PluginManager) getAllPlugins() [][]string { + plugins := make([][]string, 0, 4) + // required plugins + plugins = append(plugins, []string{condition.CIConditionPluginName, m.config.CIConditionPlugin}) + plugins = append(plugins, []string{provider.PluginName, m.config.ProviderPlugin}) + plugins = append(plugins, []string{analyzer.CommitAnalyzerPluginName, m.config.CommitAnalyzerPlugin}) + plugins = append(plugins, []string{generator.ChangelogGeneratorPluginName, m.config.ChangelogGeneratorPlugin}) + + // optional plugins for _, pl := range m.config.FilesUpdaterPlugins { - _, err := m.discovery.FindPlugin(updater.FilesUpdaterPluginName, pl) - if err != nil { - return err - } + plugins = append(plugins, []string{updater.FilesUpdaterPluginName, pl}) } - for _, pl := range m.config.HooksPlugins { - _, err := m.discovery.FindPlugin(hooks.PluginName, pl) + plugins = append(plugins, []string{hooks.PluginName, pl}) + } + return plugins +} + +func (m *PluginManager) FetchAllPlugins() error { + for _, pl := range m.getAllPlugins() { + _, err := m.discovery.FindPlugin(pl[0], pl[1]) if err != nil { return err }