| | |
| | | package version |
| | | package vaversion |
| | | |
| | | import ( |
| | | "encoding/json" |
| | | "errors" |
| | | "flag" |
| | | "fmt" |
| | | "math" |
| | | "os" |
| | | "strconv" |
| | | "strings" |
| | | ) |
| | | |
| | | type ( |
| | | VaVersion int64 |
| | | ) |
| | | |
| | | var ( |
| | | BuildVersion string |
| | | BuildTime string |
| | | CommitSha1 string |
| | | AppName string |
| | | |
| | | ShowVer bool |
| | | ) |
| | | |
| | | func init() { |
| | | var showVer bool |
| | | flag.BoolVar(&showVer, "v", false, "display build version") |
| | | flag.Parse() |
| | | if showVer { |
| | | flag.BoolVar(&ShowVer, "vbasic", false, "display build version") |
| | | } |
| | | |
| | | func Usage() { |
| | | if ShowVer { |
| | | info := make(map[string]interface{}) |
| | | info["version"] = BuildVersion |
| | | info["build"] = BuildTime |
| | | info["commit"] = CommitSha1 |
| | | info["name"] = AppName |
| | | |
| | | b, err := json.Marshal(info) |
| | | if nil != err { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | func (v VaVersion) Valid() bool { |
| | | if v < 0 { |
| | | return false |
| | | } |
| | | |
| | | majorVersion := v >> 32 |
| | | if majorVersion > math.MaxUint16 { |
| | | return false |
| | | } |
| | | |
| | | return true |
| | | } |
| | | |
| | | func (v VaVersion) Compare(v1 VaVersion) (int, error) { |
| | | if !v.Valid() { |
| | | return 0, errors.New("Invalid VaVersion left value") |
| | | } |
| | | |
| | | if !v1.Valid() { |
| | | return 0, errors.New("Invalid VaVersion right value") |
| | | } |
| | | |
| | | if v > v1 { |
| | | return 1, nil |
| | | } |
| | | |
| | | if v < v1 { |
| | | return -1, nil |
| | | } |
| | | |
| | | return 0, nil |
| | | } |
| | | |
| | | func (v VaVersion) String() (string, error) { |
| | | if !v.Valid() { |
| | | return "", errors.New("Invalid VaVersion value") |
| | | } |
| | | |
| | | majorVersion := (v >> 32) & 0xffff |
| | | minorVersion := (v >> 16) & 0xffff |
| | | buildNumber := v & 0xffff |
| | | |
| | | name := fmt.Sprintf("%d.%d.%d", majorVersion, minorVersion, buildNumber) |
| | | |
| | | return name, nil |
| | | } |
| | | |
| | | func VersionName2VaVersion(version string) (VaVersion, error) { |
| | | subVersions := strings.Split(version, ".") |
| | | if len(subVersions) != 3 { |
| | | return 0, errors.New("Incorrect version format, version formats like 1.12.3") |
| | | } |
| | | |
| | | majorVersion, err := strconv.ParseInt(subVersions[0], 10, 64) |
| | | if nil != err { |
| | | return 0, errors.New(version + " major part can't be parsed, version formats like 1.12.3") |
| | | } |
| | | |
| | | minorVersion, err := strconv.ParseInt(subVersions[1], 10, 64) |
| | | if nil != err { |
| | | return 0, errors.New(version + " minor part can't be parsed, version formats like 1.12.3") |
| | | } |
| | | |
| | | buildNumber, err := strconv.ParseInt(subVersions[2], 10, 64) |
| | | if nil != err { |
| | | return 0, errors.New(version + " build number part can't be parsed, version formats like 1.12.3") |
| | | } |
| | | |
| | | if majorVersion > math.MaxUint16 { |
| | | return 0, errors.New(version + " major version too large, max value is:" + strconv.Itoa(math.MaxUint16)) |
| | | } |
| | | |
| | | if minorVersion > math.MaxUint16 { |
| | | return 0, errors.New(version + " minor version too large, max value is:" + strconv.Itoa(math.MaxUint16)) |
| | | } |
| | | |
| | | if buildNumber > math.MaxUint16 { |
| | | return 0, errors.New(version + " build number too large, max value is:" + strconv.Itoa(math.MaxUint16)) |
| | | } |
| | | |
| | | num := (majorVersion << 32) | (minorVersion << 16) | buildNumber |
| | | |
| | | return VaVersion(num), nil |
| | | } |