Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
93 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) | ||
} |