// SPDX-License-Identifier: AGPL-3.0-only package version import ( "regexp" "runtime/debug" "strings" ) const developmentVersion = "v0.1.0-dev" var ( Version = developmentVersion Commit = "unknown" Date = "unknown" ) var ( taggedVersionPattern = regexp.MustCompile(`^v(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$`) pseudoVersionSuffixPattern = regexp.MustCompile(`(?:^|[.-])(?:0\.)?[0-9]{14}-[0-9a-f]{12,}$`) ) func init() { information, ok := debug.ReadBuildInfo() if !ok { return } Version = selectVersion(Version, information.Main.Version) for _, setting := range information.Settings { switch setting.Key { case "vcs.revision": if Commit == "unknown" && setting.Value != "" { Commit = setting.Value } case "vcs.time": if Date == "unknown" && setting.Value != "" { Date = setting.Value } } } } func selectVersion(linkerValue, moduleVersion string) string { if linkerValue != developmentVersion { return linkerValue } moduleVersion = strings.TrimSpace(moduleVersion) if !isTaggedVersion(moduleVersion) { return linkerValue } return moduleVersion } func isTaggedVersion(value string) bool { matches := taggedVersionPattern.FindStringSubmatch(value) if matches == nil { return false } prerelease := matches[1] if pseudoVersionSuffixPattern.MatchString(prerelease) { return false } for _, identifier := range strings.Split(prerelease, ".") { if len(identifier) > 1 && identifier[0] == '0' && allDecimal(identifier) { return false } } return true } func allDecimal(value string) bool { if value == "" { return false } for _, character := range value { if character < '0' || character > '9' { return false } } return true }