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 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)} }