Skip to content

Commit

Permalink
rework version scheme with appBuild
Browse files Browse the repository at this point in the history
  • Loading branch information
chappjc committed Aug 21, 2018
1 parent 2f68351 commit cc0e85c
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 29 deletions.
2 changes: 1 addition & 1 deletion api/apiroutes.go
Expand Up @@ -127,7 +127,7 @@ func NewContext(client *rpcclient.Client, params *chaincfg.Params, dataSource Da
Height: uint32(nodeHeight),
NodeConnections: conns,
APIVersion: APIVersion,
DcrdataVersion: appver.Ver.String(),
DcrdataVersion: appver.Version(),
},
JSONIndent: JSONIndent,
}
Expand Down
2 changes: 1 addition & 1 deletion config.go
Expand Up @@ -295,7 +295,7 @@ func loadConfig() (*config, error) {
appName = strings.TrimSuffix(appName, filepath.Ext(appName))
if preCfg.ShowVersion {
fmt.Printf("%s version %s (Go version %s)\n", appName,
version.Ver.String(), runtime.Version())
version.Version(), runtime.Version())
os.Exit(0)
}

Expand Down
6 changes: 3 additions & 3 deletions main.go
Expand Up @@ -76,8 +76,8 @@ func mainCore() error {
}

// Start with version info
ver := &version.Ver
log.Infof("%s version %v (Go version %s)", version.AppName, ver, runtime.Version())
log.Infof("%s version %v (Go version %s)", version.AppName,
version.Version(), runtime.Version())

// PostgreSQL
usePG := cfg.FullMode
Expand Down Expand Up @@ -309,7 +309,7 @@ func mainCore() error {
mempoolSavers = append(mempoolSavers, baseDB.MPC)

// Create the explorer system
explore := explorer.New(&baseDB, auxDB, cfg.UseRealIP, ver.String(), !cfg.NoDevPrefetch)
explore := explorer.New(&baseDB, auxDB, cfg.UseRealIP, version.Version(), !cfg.NoDevPrefetch)
if explore == nil {
return fmt.Errorf("failed to create new explorer (templates missing?)")
}
Expand Down
112 changes: 88 additions & 24 deletions version/version.go
@@ -1,34 +1,98 @@
// Copyright (c) 2018 The Decred developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.

package version

import "fmt"
import (
"bytes"
"fmt"
"strings"
)

type Version struct {
Major, Minor, Patch int
Label string
Nick string
}
const (
// semanticAlphabet defines the allowed characters for the pre-release
// portion of a semantic version string.
semanticAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"

// semanticBuildAlphabet defines the allowed characters for the build
// portion of a semantic version string.
semanticBuildAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-."
)

// These constants define the application version and follow the semantic
// versioning 2.0.0 spec (http://semver.org/).
const (
AppName string = "dcrdata"
AppMajor uint = 3
AppMinor uint = 0
AppPatch uint = 0
)

var Ver = Version{
Major: 3,
Minor: 0,
Patch: 0,
Label: ""}
// go build -ldflags "-X github.com/decred/dcrdata/version.appPreRelease= -X github.com/decred/dcrdata/version.appBuild=`git rev-parse --short HEAD`"
var (
// appPreRelease is defined as a variable so it can be overridden during the
// build process. It MUST only contain characters from semanticAlphabet per
// the semantic versioning spec.
appPreRelease = "pre"

// CommitHash may be set on the build command line:
// go build -ldflags "-X github.com/decred/dcrdata/version.CommitHash=`git describe --abbrev=8 --long | awk -F "-" '{print $(NF-1)"-"$NF}'`"
var CommitHash string
// appBuild is defined as a variable so it can be overridden during the
// build process. It MUST only contain characters from semanticBuildAlphabet
// per the semantic versioning spec.
appBuild = "dev"
)

const AppName string = "dcrdata"
// Version returns the application version as a properly formed string per the
// semantic versioning 2.0.0 spec (http://semver.org/).
func Version() string {
// Start with the major, minor, and patch versions.
version := fmt.Sprintf("%d.%d.%d", AppMajor, AppMinor, AppPatch)

func (v *Version) String() string {
var hashStr string
if CommitHash != "" {
hashStr = "+" + CommitHash
// Append pre-release version if there is one. The hyphen called for
// by the semantic versioning spec is automatically appended and should
// not be contained in the pre-release string. The pre-release version
// is not appended if it contains invalid characters.
preRelease := normalizePreRelString(appPreRelease)
if preRelease != "" {
version = fmt.Sprintf("%s-%s", version, preRelease)
}
if v.Label != "" {
return fmt.Sprintf("%d.%d.%d-%s%s",
v.Major, v.Minor, v.Patch, v.Label, hashStr)

// Append build metadata if there is any. The plus called for
// by the semantic versioning spec is automatically appended and should
// not be contained in the build metadata string. The build metadata
// string is not appended if it contains invalid characters.
build := normalizeBuildString(appBuild)
if build != "" {
version = fmt.Sprintf("%s+%s", version, build)
}
return fmt.Sprintf("%d.%d.%d%s",
v.Major, v.Minor, v.Patch, hashStr)

return version
}

// normalizeSemString returns the passed string stripped of all characters
// which are not valid according to the provided semantic versioning alphabet.
func normalizeSemString(str, alphabet string) string {
var result bytes.Buffer
for _, r := range str {
if strings.ContainsRune(alphabet, r) {
result.WriteRune(r)
}
}
return result.String()
}

// normalizePreRelString returns the passed string stripped of all characters
// which are not valid according to the semantic versioning guidelines for
// pre-release strings. In particular they MUST only contain characters in
// semanticAlphabet.
func normalizePreRelString(str string) string {
return normalizeSemString(str, semanticAlphabet)
}

// normalizeBuildString returns the passed string stripped of all characters
// which are not valid according to the semantic versioning guidelines for build
// metadata strings. In particular they MUST only contain characters in
// semanticBuildAlphabet.
func normalizeBuildString(str string) string {
return normalizeSemString(str, semanticBuildAlphabet)
}

0 comments on commit cc0e85c

Please sign in to comment.