| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | 
							- package badversion
 
- import (
 
- 	"strconv"
 
- 	"strings"
 
- 	F "github.com/sagernet/sing/common/format"
 
- )
 
- type Version struct {
 
- 	Major                int
 
- 	Minor                int
 
- 	Patch                int
 
- 	Commit               string
 
- 	PreReleaseIdentifier string
 
- 	PreReleaseVersion    int
 
- }
 
- func (v Version) After(anotherVersion Version) bool {
 
- 	if v.Major > anotherVersion.Major {
 
- 		return true
 
- 	} else if v.Major < anotherVersion.Major {
 
- 		return false
 
- 	}
 
- 	if v.Minor > anotherVersion.Minor {
 
- 		return true
 
- 	} else if v.Minor < anotherVersion.Minor {
 
- 		return false
 
- 	}
 
- 	if v.Patch > anotherVersion.Patch {
 
- 		return true
 
- 	} else if v.Patch < anotherVersion.Patch {
 
- 		return false
 
- 	}
 
- 	if v.PreReleaseIdentifier == "" && anotherVersion.PreReleaseIdentifier != "" {
 
- 		return true
 
- 	} else if v.PreReleaseIdentifier != "" && anotherVersion.PreReleaseIdentifier == "" {
 
- 		return false
 
- 	}
 
- 	if v.PreReleaseIdentifier != "" && anotherVersion.PreReleaseIdentifier != "" {
 
- 		if v.PreReleaseIdentifier == anotherVersion.PreReleaseIdentifier {
 
- 			if v.PreReleaseVersion > anotherVersion.PreReleaseVersion {
 
- 				return true
 
- 			} else if v.PreReleaseVersion < anotherVersion.PreReleaseVersion {
 
- 				return false
 
- 			}
 
- 		} else if v.PreReleaseIdentifier == "rc" && anotherVersion.PreReleaseIdentifier == "beta" {
 
- 			return true
 
- 		} else if v.PreReleaseIdentifier == "beta" && anotherVersion.PreReleaseIdentifier == "rc" {
 
- 			return false
 
- 		} else if v.PreReleaseIdentifier == "beta" && anotherVersion.PreReleaseIdentifier == "alpha" {
 
- 			return true
 
- 		} else if v.PreReleaseIdentifier == "alpha" && anotherVersion.PreReleaseIdentifier == "beta" {
 
- 			return false
 
- 		}
 
- 	}
 
- 	return false
 
- }
 
- func (v Version) VersionString() string {
 
- 	return F.ToString(v.Major, ".", v.Minor, ".", v.Patch)
 
- }
 
- func (v Version) String() string {
 
- 	version := F.ToString(v.Major, ".", v.Minor, ".", v.Patch)
 
- 	if v.PreReleaseIdentifier != "" {
 
- 		version = F.ToString(version, "-", v.PreReleaseIdentifier, ".", v.PreReleaseVersion)
 
- 	}
 
- 	return version
 
- }
 
- func (v Version) BadString() string {
 
- 	version := F.ToString(v.Major, ".", v.Minor)
 
- 	if v.Patch > 0 {
 
- 		version = F.ToString(version, ".", v.Patch)
 
- 	}
 
- 	if v.PreReleaseIdentifier != "" {
 
- 		version = F.ToString(version, "-", v.PreReleaseIdentifier)
 
- 		if v.PreReleaseVersion > 0 {
 
- 			version = F.ToString(version, v.PreReleaseVersion)
 
- 		}
 
- 	}
 
- 	return version
 
- }
 
- func Parse(versionName string) (version Version) {
 
- 	if strings.HasPrefix(versionName, "v") {
 
- 		versionName = versionName[1:]
 
- 	}
 
- 	if strings.Contains(versionName, "-") {
 
- 		parts := strings.Split(versionName, "-")
 
- 		versionName = parts[0]
 
- 		identifier := parts[1]
 
- 		if strings.Contains(identifier, ".") {
 
- 			identifierParts := strings.Split(identifier, ".")
 
- 			version.PreReleaseIdentifier = identifierParts[0]
 
- 			if len(identifierParts) >= 2 {
 
- 				version.PreReleaseVersion, _ = strconv.Atoi(identifierParts[1])
 
- 			}
 
- 		} else {
 
- 			if strings.HasPrefix(identifier, "alpha") {
 
- 				version.PreReleaseIdentifier = "alpha"
 
- 				version.PreReleaseVersion, _ = strconv.Atoi(identifier[5:])
 
- 			} else if strings.HasPrefix(identifier, "beta") {
 
- 				version.PreReleaseIdentifier = "beta"
 
- 				version.PreReleaseVersion, _ = strconv.Atoi(identifier[4:])
 
- 			} else {
 
- 				version.Commit = identifier
 
- 			}
 
- 		}
 
- 	}
 
- 	versionElements := strings.Split(versionName, ".")
 
- 	versionLen := len(versionElements)
 
- 	if versionLen >= 1 {
 
- 		version.Major, _ = strconv.Atoi(versionElements[0])
 
- 	}
 
- 	if versionLen >= 2 {
 
- 		version.Minor, _ = strconv.Atoi(versionElements[1])
 
- 	}
 
- 	if versionLen >= 3 {
 
- 		version.Patch, _ = strconv.Atoi(versionElements[2])
 
- 	}
 
- 	return
 
- }
 
 
  |