This marks the start of a new release process as compared to previous releases. Instead of bumping the version just before a release and releasing from the master branch, as has been done up to this point, the minor (or major when necessary) will now be bumped on the master branch at the beginning of a release cycle. In addition, the pre-release portion of the semantic version is now the string "pre" to help make it more obvious that the master branch represents a pre-release build of work leading up to the next release. When a new release is prepared, a new release branch will be created that has a naming scheme of "release-vX.Y", where X is the major and Y is the minor. Any additional commits needed to prepare the release leading up to a release candidate will be cherry-picked to the release branch, and all tags for releases and release candidates will be created against that. This implies that should any additional patch releases be necessary, the relevant commits will also be cherry-picked to the release branch as needed, followed by a new release candidate for the patch release and the eventual patch release.
100 lines
3.5 KiB
Go
100 lines
3.5 KiB
Go
// Copyright (c) 2013-2014 The btcsuite developers
|
|
// Copyright (c) 2015-2018 The Decred developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
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 (
|
|
appMajor uint = 1
|
|
appMinor uint = 4
|
|
appPatch uint = 0
|
|
)
|
|
|
|
var (
|
|
// appPreRelease is defined as a variable so it can be overridden during
|
|
// the build process with '-ldflags "-X main.appPreRelease=foo"' if
|
|
// needed. It MUST only contain characters from semanticAlphabet per
|
|
// the semantic versioning spec.
|
|
appPreRelease = "pre"
|
|
|
|
// appBuild is defined as a variable so it can be overridden during the
|
|
// build process with '-ldflags "-X main.appBuild=foo"' if needed. It
|
|
// MUST only contain characters from semanticBuildAlphabet per the
|
|
// semantic versioning spec.
|
|
appBuild = "dev"
|
|
)
|
|
|
|
// 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)
|
|
|
|
// 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)
|
|
}
|
|
|
|
// 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 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)
|
|
}
|