diff --git a/.pending/breaking/sdk/4250-BaseApp-Query-r b/.pending/breaking/sdk/4250-BaseApp-Query-r new file mode 100644 index 00000000000..0adee63c8da --- /dev/null +++ b/.pending/breaking/sdk/4250-BaseApp-Query-r @@ -0,0 +1,3 @@ +#4250 BaseApp.Query() returns app's version string set via BaseApp.SetAppVersion() +when handling /app/version queries instead of the version string passed as build +flag at compile time. diff --git a/.pending/features/sdk/4250-New-BaseApp-Set b/.pending/features/sdk/4250-New-BaseApp-Set new file mode 100644 index 00000000000..11edde4a00b --- /dev/null +++ b/.pending/features/sdk/4250-New-BaseApp-Set @@ -0,0 +1 @@ +#4250 New BaseApp.{,Set}AppVersion() methods to get/set app's version string. diff --git a/Makefile b/Makefile index 3f489ae4745..5418e0f4d17 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,8 @@ build_tags := $(strip $(build_tags)) # process linker flags -ldflags = -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ +ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=gaia \ + -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags)" diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 119450dc5b9..0ad9f2309d4 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -20,7 +20,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" ) // Key to store the consensus params in the main store. @@ -85,6 +84,9 @@ type BaseApp struct { // height at which to halt the chain and gracefully shutdown haltHeight uint64 + + // application's version string + appVersion string } var _ abci.Application = (*BaseApp)(nil) @@ -120,6 +122,11 @@ func (app *BaseApp) Name() string { return app.name } +// AppVersion returns the application's version string. +func (app *BaseApp) AppVersion() string { + return app.appVersion +} + // Logger returns the logger of the BaseApp. func (app *BaseApp) Logger() log.Logger { return app.logger @@ -439,7 +446,7 @@ func handleQueryApp(app *BaseApp, path []string, req abci.RequestQuery) (res abc return abci.ResponseQuery{ Code: uint32(sdk.CodeOK), Codespace: string(sdk.CodespaceRoot), - Value: []byte(version.Version), + Value: []byte(app.appVersion), } default: diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index c3d435f9f27..c552ed4d64e 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -130,6 +130,26 @@ func TestLoadVersion(t *testing.T) { testLoadVersionHelper(t, app, int64(2), commitID2) } +func TestAppVersionSetterGetter(t *testing.T) { + logger := defaultLogger() + pruningOpt := SetPruning(store.PruneSyncable) + db := dbm.NewMemDB() + name := t.Name() + app := NewBaseApp(name, logger, db, nil, pruningOpt) + + require.Equal(t, "", app.AppVersion()) + res := app.Query(abci.RequestQuery{Path: "app/version"}) + require.True(t, res.IsOK()) + require.Equal(t, "", string(res.Value)) + + versionString := "1.0.0" + app.SetAppVersion(versionString) + require.Equal(t, versionString, app.AppVersion()) + res = app.Query(abci.RequestQuery{Path: "app/version"}) + require.True(t, res.IsOK()) + require.Equal(t, versionString, string(res.Value)) +} + func TestLoadVersionInvalid(t *testing.T) { logger := log.NewNopLogger() pruningOpt := SetPruning(store.PruneSyncable) @@ -226,6 +246,9 @@ func TestBaseAppOptionSeal(t *testing.T) { require.Panics(t, func() { app.SetName("") }) + require.Panics(t, func() { + app.SetAppVersion("") + }) require.Panics(t, func() { app.SetDB(nil) }) diff --git a/baseapp/options.go b/baseapp/options.go index d78f59958a7..1062c45b448 100644 --- a/baseapp/options.go +++ b/baseapp/options.go @@ -40,6 +40,14 @@ func (app *BaseApp) SetName(name string) { app.name = name } +// SetAppVersion sets the application's version string. +func (app *BaseApp) SetAppVersion(v string) { + if app.sealed { + panic("SetAppVersion() on sealed BaseApp") + } + app.appVersion = v +} + func (app *BaseApp) SetDB(db dbm.DB) { if app.sealed { panic("SetDB() on sealed BaseApp") diff --git a/cmd/gaia/Makefile b/cmd/gaia/Makefile index 66710ffc67f..8715aa75bd2 100644 --- a/cmd/gaia/Makefile +++ b/cmd/gaia/Makefile @@ -43,7 +43,8 @@ build_tags := $(strip $(build_tags)) # process linker flags -ldflags = -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ +ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=gaia \ + -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags)" diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 3ff83747de4..5c732aff81f 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -9,6 +9,7 @@ import ( bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/crisis" @@ -78,6 +79,7 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b bApp := bam.NewBaseApp(appName, logger, db, auth.DefaultTxDecoder(cdc), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) + bApp.SetAppVersion(version.Version) var app = &GaiaApp{ BaseApp: bApp, diff --git a/version/command.go b/version/command.go index c3ff71df10e..b886a9f24e4 100644 --- a/version/command.go +++ b/version/command.go @@ -16,7 +16,8 @@ const ( var ( - // VersionCmd prints out the current sdk version + // VersionCmd prints out the application's version + // information passed via build flags. VersionCmd = &cobra.Command{ Use: "version", Short: "Print the app version", @@ -24,12 +25,12 @@ var ( verInfo := newVersionInfo() if !viper.GetBool(flagLong) { - fmt.Println(verInfo.CosmosSDK) + fmt.Println(verInfo.Version) return nil } if viper.GetString(cli.OutputFlag) != "json" { - fmt.Print(verInfo) + fmt.Println(verInfo) return nil } diff --git a/version/version.go b/version/version.go index aad02d1904d..c46f9deca63 100644 --- a/version/version.go +++ b/version/version.go @@ -1,4 +1,19 @@ -//nolint +// This package is a convenience utility that provides SDK +// consumers with a ready-to-use version command that +// produces apps versioning information based on flags +// passed at compile time. +// +// Configure the version command +// +// The version command can be just added to your cobra root command. +// At build time, the variables Name, Version, Commit, GoSumHash, and +// BuildTags can be passed as build flags as shown in the following +// example: +// +// go build -X github.com/cosmos/cosmos-sdk/version.Name=dapp \ +// -X github.com/cosmos/cosmos-sdk/version.Version=1.0 \ +// -X github.com/cosmos/cosmos-sdk/version.Commit=f0f7b7dab7e36c20b757cebce0e8f4fc5b95de60 \ +// -X "github.com/cosmos/cosmos-sdk/version.BuildTags=linux darwin amd64" package version import ( @@ -6,16 +21,22 @@ import ( "runtime" ) -// Variables set by build flags var ( - Commit = "" - Version = "" + // Application's name + Name = "" + // Application's version string + Version = "" + // Commit + Commit = "" + // Hash of the go.sum file GoSumHash = "" + // Build tags BuildTags = "" ) type versionInfo struct { - CosmosSDK string `json:"cosmos_sdk"` + Name string `json:"name"` + Version string `json:"version"` GitCommit string `json:"commit"` GoSumHash string `json:"gosum_hash"` BuildTags string `json:"build_tags"` @@ -23,18 +44,19 @@ type versionInfo struct { } func (v versionInfo) String() string { - return fmt.Sprintf(`cosmos-sdk: %s + return fmt.Sprintf(`%s: %s git commit: %s go.sum hash: %s build tags: %s -%s`, v.CosmosSDK, v.GitCommit, v.GoSumHash, v.BuildTags, v.GoVersion) +%s`, v.Name, v.Version, v.GitCommit, v.GoSumHash, v.BuildTags, v.GoVersion) } func newVersionInfo() versionInfo { return versionInfo{ + Name, Version, Commit, GoSumHash, BuildTags, - fmt.Sprintf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)} + fmt.Sprintf("go version %s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH)} }