From 38f93128eba36fd96aaaaa5ff3c893981e0c7027 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Thu, 2 May 2019 20:37:44 +0100 Subject: [PATCH] Remove baseapp dependency on the version package (#4250) The version package is meant to be a convenience utility that provides SDK consumers with a ready-to-use version command that produces app's versioning information from flags passed at compile time. It will not make sense anymore for the baseapp package to depend on the version package once gaia will have been migrated away from the SDK main repository as we neither want to make assumptions nor set expectations on downstream apps buildsystems. Thus BaseApp now provides SetAppVersion() and AppVersion() to to allow SDK consumers to set BaseApp's version information string once the struct is initialised. --- .pending/breaking/sdk/4250-BaseApp-Query-r | 3 ++ .pending/features/sdk/4250-New-BaseApp-Set | 1 + Makefile | 3 +- baseapp/baseapp.go | 11 +++++-- baseapp/baseapp_test.go | 23 +++++++++++++ baseapp/options.go | 8 +++++ cmd/gaia/Makefile | 3 +- cmd/gaia/app/app.go | 2 ++ version/command.go | 7 ++-- version/version.go | 38 +++++++++++++++++----- 10 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 .pending/breaking/sdk/4250-BaseApp-Query-r create mode 100644 .pending/features/sdk/4250-New-BaseApp-Set diff --git a/.pending/breaking/sdk/4250-BaseApp-Query-r b/.pending/breaking/sdk/4250-BaseApp-Query-r new file mode 100644 index 000000000..0adee63c8 --- /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 000000000..11edde4a0 --- /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 3f489ae47..5418e0f4d 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 119450dc5..0ad9f2309 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 c3d435f9f..c552ed4d6 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 d78f59958..1062c45b4 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 66710ffc6..8715aa75b 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 3ff83747d..5c732aff8 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 c3ff71df1..b886a9f24 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 aad02d190..c46f9deca 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)} }