diff --git a/server/cmd/execute.go b/server/cmd/execute.go new file mode 100644 index 0000000000..83e9bc0b25 --- /dev/null +++ b/server/cmd/execute.go @@ -0,0 +1,37 @@ +package cmd + +import ( + "context" + + "github.com/rs/zerolog" + "github.com/spf13/cobra" + tmcfg "github.com/tendermint/tendermint/config" + tmcli "github.com/tendermint/tendermint/libs/cli" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/server" +) + +// Execute executes the root command of an application. It handles creating a +// server context object with the appropriate server and client objects injected +// into the underlying stdlib Context. It also handles adding core CLI flags, +// specifically the logging flags. It returns an error upon execution failure. +func Execute(rootCmd *cobra.Command, defaultHome string) error { + // Create and set a client.Context on the command's Context. During the pre-run + // of the root command, a default initialized client.Context is provided to + // seed child command execution with values such as AccountRetriver, Keyring, + // and a Tendermint RPC. This requires the use of a pointer reference when + // getting and setting the client.Context. Ideally, we utilize + // https://github.com/spf13/cobra/pull/1118. + srvCtx := server.NewDefaultContext() + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &client.Context{}) + ctx = context.WithValue(ctx, server.ServerContextKey, srvCtx) + + rootCmd.PersistentFlags().String(flags.FlagLogLevel, zerolog.InfoLevel.String(), "The logging level (trace|debug|info|warn|error|fatal|panic)") + rootCmd.PersistentFlags().String(flags.FlagLogFormat, tmcfg.LogFormatPlain, "The logging format (json|plain)") + + executor := tmcli.PrepareBaseCmd(rootCmd, "", defaultHome) + return executor.ExecuteContext(ctx) +} diff --git a/simapp/simd/cmd/cmd_test.go b/simapp/simd/cmd/cmd_test.go index ed4d8bad68..1a9183d33e 100644 --- a/simapp/simd/cmd/cmd_test.go +++ b/simapp/simd/cmd/cmd_test.go @@ -6,6 +6,8 @@ import ( "github.com/stretchr/testify/require" + svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/simapp/simd/cmd" "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" ) @@ -18,6 +20,5 @@ func TestInitCmd(t *testing.T) { fmt.Sprintf("--%s=%s", cli.FlagOverwrite, "true"), // Overwrite genesis.json, in case it already exists }) - err := cmd.Execute(rootCmd) - require.NoError(t, err) + require.NoError(t, svrcmd.Execute(rootCmd, simapp.DefaultNodeHome)) } diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index d9a81a9973..469645019b 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -1,15 +1,12 @@ package cmd import ( - "context" "io" "os" "path/filepath" - "github.com/rs/zerolog" "github.com/spf13/cast" "github.com/spf13/cobra" - tmcfg "github.com/tendermint/tendermint/config" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" @@ -68,26 +65,6 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { return rootCmd, encodingConfig } -// Execute executes the root command. -func Execute(rootCmd *cobra.Command) error { - // Create and set a client.Context on the command's Context. During the pre-run - // of the root command, a default initialized client.Context is provided to - // seed child command execution with values such as AccountRetriver, Keyring, - // and a Tendermint RPC. This requires the use of a pointer reference when - // getting and setting the client.Context. Ideally, we utilize - // https://github.com/spf13/cobra/pull/1118. - srvCtx := server.NewDefaultContext() - ctx := context.Background() - ctx = context.WithValue(ctx, client.ClientContextKey, &client.Context{}) - ctx = context.WithValue(ctx, server.ServerContextKey, srvCtx) - - rootCmd.PersistentFlags().String(flags.FlagLogLevel, zerolog.InfoLevel.String(), "The logging level (trace|debug|info|warn|error|fatal|panic)") - rootCmd.PersistentFlags().String(flags.FlagLogFormat, tmcfg.LogFormatPlain, "The logging format (json|plain)") - - executor := tmcli.PrepareBaseCmd(rootCmd, "", simapp.DefaultNodeHome) - return executor.ExecuteContext(ctx) -} - func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { authclient.Codec = encodingConfig.Marshaler diff --git a/simapp/simd/main.go b/simapp/simd/main.go index 26fb4d7b3e..3e744360f4 100644 --- a/simapp/simd/main.go +++ b/simapp/simd/main.go @@ -4,15 +4,19 @@ import ( "os" "github.com/cosmos/cosmos-sdk/server" + svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/simapp/simd/cmd" ) func main() { rootCmd, _ := cmd.NewRootCmd() - if err := cmd.Execute(rootCmd); err != nil { + + if err := svrcmd.Execute(rootCmd, simapp.DefaultNodeHome); err != nil { switch e := err.(type) { case server.ErrorCode: os.Exit(e.Code) + default: os.Exit(1) }