diff --git a/go.sum b/go.sum index 9d3d5e374a..6baf08233d 100644 --- a/go.sum +++ b/go.sum @@ -1354,8 +1354,6 @@ golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/ignite/cmd/plugin.go b/ignite/cmd/plugin.go index f93e7a39f8..835374c5c5 100644 --- a/ignite/cmd/plugin.go +++ b/ignite/cmd/plugin.go @@ -46,6 +46,7 @@ func LoadPlugins(ctx context.Context, cmd *cobra.Command) error { if err == nil { pluginsConfigs = append(pluginsConfigs, globalCfg.Plugins...) } + ensureDefaultPlugins(cmd, globalCfg) if len(pluginsConfigs) == 0 { diff --git a/ignite/cmd/plugin_default.go b/ignite/cmd/plugin_default.go index 17b564be1d..c51d218015 100644 --- a/ignite/cmd/plugin_default.go +++ b/ignite/cmd/plugin_default.go @@ -10,36 +10,12 @@ import ( "github.com/ignite/cli/ignite/services/plugin" ) -type defaultPlugin struct { - use string - short string - aliases []string - path string -} - -const ( - PluginNetworkVersion = "v0.1.1" - PluginNetworkPath = "github.com/ignite/cli-plugin-network@" + PluginNetworkVersion -) - -// defaultPlugins holds the plugin that are considered trustable and for which -// a command will added if the plugin is not already installed. -// When the user executes that command, the plugin is automatically installed. -var defaultPlugins = []defaultPlugin{ - { - use: "network", - short: "Launch a blockchain in production", - aliases: []string{"n"}, - path: PluginNetworkPath, - }, -} - // ensureDefaultPlugins ensures that all defaultPlugins are wether registered // in cfg OR have an install command added to rootCmd. func ensureDefaultPlugins(rootCmd *cobra.Command, cfg *pluginsconfig.Config) { - for _, dp := range defaultPlugins { + for _, dp := range plugin.GetDefaultPlugins() { // Check if plugin is declared in global config - if cfg.HasPlugin(dp.path) { + if cfg.HasPlugin(dp.Path) { // plugin found nothing to do continue } @@ -52,27 +28,27 @@ func ensureDefaultPlugins(rootCmd *cobra.Command, cfg *pluginsconfig.Config) { // - register the config in the global config // - load the plugin // - execute the command thanks to the loaded plugin. -func newPluginInstallCmd(dp defaultPlugin) *cobra.Command { +func newPluginInstallCmd(dp plugin.DefaultPlugin) *cobra.Command { return &cobra.Command{ - Use: dp.use, - Short: dp.short, - Aliases: dp.aliases, + Use: dp.Use, + Short: dp.Short, + Aliases: dp.Aliases, DisableFlagParsing: true, // Avoid -h to skip command run RunE: func(cmd *cobra.Command, _ []string) error { cfg, err := parseGlobalPlugins() if err != nil { return err } - if cfg.HasPlugin(dp.path) { + if cfg.HasPlugin(dp.Path) { // plugin already declared in global plugins, this shouldn't happen // because this is actually why this command has been added, so let's // break violently - panic(fmt.Sprintf("plugin %q unexpected in global config", dp.path)) + panic(fmt.Sprintf("plugin %q unexpected in global config", dp.Path)) } // add plugin to config pluginCfg := pluginsconfig.Plugin{ - Path: dp.path, + Path: dp.Path, } cfg.Plugins = append(cfg.Plugins, pluginCfg) if err := cfg.Save(); err != nil { diff --git a/ignite/cmd/plugin_default_test.go b/ignite/cmd/plugin_default_test.go index 04528f14ec..54bc57ea95 100644 --- a/ignite/cmd/plugin_default_test.go +++ b/ignite/cmd/plugin_default_test.go @@ -32,10 +32,13 @@ func TestEnsureDefaultPlugins(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + // Arrange cmd := &cobra.Command{Use: "ignite"} + // Act ensureDefaultPlugins(cmd, tt.cfg) + // Assert expectedCmd := findCommandByPath(cmd, "ignite network") if tt.expectAddedInCommand { assert.NotNil(t, expectedCmd) diff --git a/ignite/internal/tools/gen-cli-docs/main.go b/ignite/internal/tools/gen-cli-docs/main.go index 56ead1c6df..a298dc59e2 100644 --- a/ignite/internal/tools/gen-cli-docs/main.go +++ b/ignite/internal/tools/gen-cli-docs/main.go @@ -58,9 +58,15 @@ func run(outPath string) error { if err != nil { return err } + + p, err := plugin.GetDefaultNetworkPlugin() + if err != nil { + return err + } + + // Add network plugin cfg.Plugins = append(cfg.Plugins, pluginsconfig.Plugin{ - // Add network plugin - Path: ignitecmd.PluginNetworkPath, + Path: p.Path, }) if err := cfg.Save(); err != nil { return err diff --git a/ignite/services/plugin/default.go b/ignite/services/plugin/default.go new file mode 100644 index 0000000000..8032108279 --- /dev/null +++ b/ignite/services/plugin/default.go @@ -0,0 +1,38 @@ +package plugin + +import ( + "errors" +) + +var defaultPlugins = []DefaultPlugin{ + { + Use: "network", + Short: "Launch a blockchain in production", + Aliases: []string{"n"}, + Path: "github.com/ignite/cli-plugin-network@v0.1.1", + }, +} + +// DefaultPlugin defines a default Ignite plugin. +type DefaultPlugin struct { + Use string + Short string + Aliases []string + Path string +} + +// GetDefaultPlugins returns the list of default Ignite plugins. +func GetDefaultPlugins() []DefaultPlugin { + return defaultPlugins +} + +// GetDefaultNetworkPlugin returns the default network plugin. +func GetDefaultNetworkPlugin() (DefaultPlugin, error) { + for _, p := range defaultPlugins { + if p.Use == "network" { + return p, nil + } + } + + return DefaultPlugin{}, errors.New("default network plugin not found") +} diff --git a/ignite/services/plugin/default_test.go b/ignite/services/plugin/default_test.go new file mode 100644 index 0000000000..70fd691277 --- /dev/null +++ b/ignite/services/plugin/default_test.go @@ -0,0 +1,28 @@ +package plugin + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetDefaultPlugins(t *testing.T) { + // Act + plugins := GetDefaultPlugins() + + // Assert + require.Greater(t, len(plugins), 0) +} + +func TestGetDefaultNetworkPlugin(t *testing.T) { + // Act + p, err := GetDefaultNetworkPlugin() + + // Assert + require.NoError(t, err) + require.True(t, strings.HasPrefix(p.Path, "github.com/ignite/cli-plugin-network@")) + require.Equal(t, "network", p.Use) + require.Equal(t, []string{"n"}, p.Aliases) + require.NotEmpty(t, p.Short) +} diff --git a/integration/network/network_test.go b/integration/network/network_test.go index 0761c3601a..1b1e9b4ec1 100644 --- a/integration/network/network_test.go +++ b/integration/network/network_test.go @@ -3,6 +3,7 @@ package network_test import ( "bytes" "context" + "fmt" "os" "path/filepath" "strings" @@ -13,19 +14,18 @@ import ( "github.com/go-git/go-git/v5/plumbing" "github.com/stretchr/testify/require" - ignitecmd "github.com/ignite/cli/ignite/cmd" chainconfig "github.com/ignite/cli/ignite/config/chain" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" "github.com/ignite/cli/ignite/pkg/gomodule" "github.com/ignite/cli/ignite/pkg/xgit" + "github.com/ignite/cli/ignite/services/plugin" envtest "github.com/ignite/cli/integration" ) const ( - spnModule = "github.com/tendermint/spn" - spnRepoURL = "https://" + spnModule - spnConfigFile = "config_2.yml" - pluginNetworkRepoURL = "https://" + ignitecmd.PluginNetworkPath + spnModule = "github.com/tendermint/spn" + spnRepoURL = "https://" + spnModule + spnConfigFile = "config_2.yml" ) // setupSPN executes the following tasks: @@ -43,9 +43,12 @@ func setupSPN(env envtest.Env) string { spnVersion string ) // Clone the cli-plugin-network with the expected version - err := xgit.Clone(context.Background(), pluginNetworkRepoURL, pluginPath) + p, err := plugin.GetDefaultNetworkPlugin() require.NoError(err) - t.Logf("Checkout cli-plugin-revision to ref %q", ignitecmd.PluginNetworkPath) + pluginNetworkRepoURL := fmt.Sprintf("https://%s", p.Path) + err = xgit.Clone(context.Background(), pluginNetworkRepoURL, pluginPath) + require.NoError(err) + t.Logf("Checkout cli-plugin-revision to ref %q", p.Path) // Add plugin to config env.Must(env.Exec("add plugin network", step.NewSteps(step.New(