diff --git a/server/cmd/execute.go b/server/cmd/execute.go new file mode 100644 index 000000000000..83e9bc0b25a8 --- /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 ed4d8bad68b5..1a9183d33e08 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 d9a81a9973f7..469645019bd7 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 26fb4d7b3ef6..3e744360f468 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) }