5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 07:59:47 +08:00
wails/cmd/semver.go
2019-05-10 23:01:50 +10:00

80 lines
2.2 KiB
Go

package cmd
import (
"regexp"
"github.com/masterminds/semver"
)
type SemanticVersion struct {
Version *semver.Version
validPrereleaseRegex *regexp.Regexp
validReleaseRegex *regexp.Regexp
}
// NewSemanticVersion creates a new SemanticVersion object with the given version string
func NewSemanticVersion(version string) (*SemanticVersion, error) {
semverVersion, err := semver.NewVersion(version)
if err != nil {
return nil, err
}
const SemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?`
const SemPreVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*)`
return &SemanticVersion{
Version: semverVersion,
validPrereleaseRegex: regexp.MustCompile(SemPreVerRegex),
validReleaseRegex: regexp.MustCompile(SemVerRegex),
}, nil
}
// IsRelease returns true if it's a release version
func (s *SemanticVersion) IsRelease() bool {
return s.validReleaseRegex.MatchString(s.Version.String())
}
// IsPreRelease returns true if it's a prerelease version
func (s *SemanticVersion) IsPreRelease() bool {
return s.validPrereleaseRegex.MatchString(s.Version.String())
}
func (s *SemanticVersion) String() string {
return s.Version.String()
}
func (s *SemanticVersion) IsGreaterThan(version *SemanticVersion) (bool, error) {
// Set up new constraint
constraint, err := semver.NewConstraint("> " + version.Version.String())
if err != nil {
return false, err
}
// Check if the desired one is greater than the requested on
success, msgs := constraint.Validate(s.Version)
if !success {
return false, msgs[0]
}
return true, nil
}
// SemverCollection is a collection of SemanticVersion objects
type SemverCollection []*SemanticVersion
// Len returns the length of a collection. The number of Version instances
// on the slice.
func (c SemverCollection) Len() int {
return len(c)
}
// Less is needed for the sort interface to compare two Version objects on the
// slice. If checks if one is less than the other.
func (c SemverCollection) Less(i, j int) bool {
return c[i].Version.LessThan(c[j].Version)
}
// Swap is needed for the sort interface to replace the Version objects
// at two different positions in the slice.
func (c SemverCollection) Swap(i, j int) {
c[i], c[j] = c[j], c[i]
}