mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 07:40:17 +08:00
107 lines
2.9 KiB
Go
107 lines
2.9 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/Masterminds/semver"
|
|
)
|
|
|
|
// SemanticVersion is a struct containing a semantic version
|
|
type SemanticVersion struct {
|
|
Version *semver.Version
|
|
}
|
|
|
|
// 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
|
|
}
|
|
return &SemanticVersion{
|
|
Version: semverVersion,
|
|
}, nil
|
|
}
|
|
|
|
// IsRelease returns true if it's a release version
|
|
func (s *SemanticVersion) IsRelease() bool {
|
|
// Limit to v1
|
|
if s.Version.Major() != 1 {
|
|
return false
|
|
}
|
|
return len(s.Version.Prerelease()) == 0 && len(s.Version.Metadata()) == 0
|
|
}
|
|
|
|
// IsPreRelease returns true if it's a prerelease version
|
|
func (s *SemanticVersion) IsPreRelease() bool {
|
|
// Limit to v1
|
|
if s.Version.Major() != 1 {
|
|
return false
|
|
}
|
|
return len(s.Version.Prerelease()) > 0
|
|
}
|
|
|
|
func (s *SemanticVersion) String() string {
|
|
return s.Version.String()
|
|
}
|
|
|
|
// IsGreaterThan returns true if this version is greater than the given version
|
|
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
|
|
}
|
|
|
|
// IsGreaterThanOrEqual returns true if this version is greater than or equal the given version
|
|
func (s *SemanticVersion) IsGreaterThanOrEqual(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
|
|
}
|
|
|
|
// MainVersion returns the main version of any version+prerelease+metadata
|
|
// EG: MainVersion("1.2.3-pre") => "1.2.3"
|
|
func (s *SemanticVersion) MainVersion() *SemanticVersion {
|
|
mainVersion := fmt.Sprintf("%d.%d.%d", s.Version.Major(), s.Version.Minor(), s.Version.Patch())
|
|
result, _ := NewSemanticVersion(mainVersion)
|
|
return result
|
|
}
|
|
|
|
// 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]
|
|
}
|