version.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package badversion
  2. import (
  3. "strconv"
  4. "strings"
  5. F "github.com/sagernet/sing/common/format"
  6. )
  7. type Version struct {
  8. Major int
  9. Minor int
  10. Patch int
  11. Commit string
  12. PreReleaseIdentifier string
  13. PreReleaseVersion int
  14. }
  15. func (v Version) After(anotherVersion Version) bool {
  16. if v.Major > anotherVersion.Major {
  17. return true
  18. } else if v.Major < anotherVersion.Major {
  19. return false
  20. }
  21. if v.Minor > anotherVersion.Minor {
  22. return true
  23. } else if v.Minor < anotherVersion.Minor {
  24. return false
  25. }
  26. if v.Patch > anotherVersion.Patch {
  27. return true
  28. } else if v.Patch < anotherVersion.Patch {
  29. return false
  30. }
  31. if v.PreReleaseIdentifier == "" && anotherVersion.PreReleaseIdentifier != "" {
  32. return true
  33. } else if v.PreReleaseIdentifier != "" && anotherVersion.PreReleaseIdentifier == "" {
  34. return false
  35. }
  36. if v.PreReleaseIdentifier != "" && anotherVersion.PreReleaseIdentifier != "" {
  37. if v.PreReleaseIdentifier == anotherVersion.PreReleaseIdentifier {
  38. if v.PreReleaseVersion > anotherVersion.PreReleaseVersion {
  39. return true
  40. } else if v.PreReleaseVersion < anotherVersion.PreReleaseVersion {
  41. return false
  42. }
  43. } else if v.PreReleaseIdentifier == "rc" && anotherVersion.PreReleaseIdentifier == "beta" {
  44. return true
  45. } else if v.PreReleaseIdentifier == "beta" && anotherVersion.PreReleaseIdentifier == "rc" {
  46. return false
  47. } else if v.PreReleaseIdentifier == "beta" && anotherVersion.PreReleaseIdentifier == "alpha" {
  48. return true
  49. } else if v.PreReleaseIdentifier == "alpha" && anotherVersion.PreReleaseIdentifier == "beta" {
  50. return false
  51. }
  52. }
  53. return false
  54. }
  55. func (v Version) VersionString() string {
  56. return F.ToString(v.Major, ".", v.Minor, ".", v.Patch)
  57. }
  58. func (v Version) String() string {
  59. version := F.ToString(v.Major, ".", v.Minor, ".", v.Patch)
  60. if v.PreReleaseIdentifier != "" {
  61. version = F.ToString(version, "-", v.PreReleaseIdentifier, ".", v.PreReleaseVersion)
  62. }
  63. return version
  64. }
  65. func (v Version) BadString() string {
  66. version := F.ToString(v.Major, ".", v.Minor)
  67. if v.Patch > 0 {
  68. version = F.ToString(version, ".", v.Patch)
  69. }
  70. if v.PreReleaseIdentifier != "" {
  71. version = F.ToString(version, "-", v.PreReleaseIdentifier)
  72. if v.PreReleaseVersion > 0 {
  73. version = F.ToString(version, v.PreReleaseVersion)
  74. }
  75. }
  76. return version
  77. }
  78. func Parse(versionName string) (version Version) {
  79. if strings.HasPrefix(versionName, "v") {
  80. versionName = versionName[1:]
  81. }
  82. if strings.Contains(versionName, "-") {
  83. parts := strings.Split(versionName, "-")
  84. versionName = parts[0]
  85. identifier := parts[1]
  86. if strings.Contains(identifier, ".") {
  87. identifierParts := strings.Split(identifier, ".")
  88. version.PreReleaseIdentifier = identifierParts[0]
  89. if len(identifierParts) >= 2 {
  90. version.PreReleaseVersion, _ = strconv.Atoi(identifierParts[1])
  91. }
  92. } else {
  93. if strings.HasPrefix(identifier, "alpha") {
  94. version.PreReleaseIdentifier = "alpha"
  95. version.PreReleaseVersion, _ = strconv.Atoi(identifier[5:])
  96. } else if strings.HasPrefix(identifier, "beta") {
  97. version.PreReleaseIdentifier = "beta"
  98. version.PreReleaseVersion, _ = strconv.Atoi(identifier[4:])
  99. } else {
  100. version.Commit = identifier
  101. }
  102. }
  103. }
  104. versionElements := strings.Split(versionName, ".")
  105. versionLen := len(versionElements)
  106. if versionLen >= 1 {
  107. version.Major, _ = strconv.Atoi(versionElements[0])
  108. }
  109. if versionLen >= 2 {
  110. version.Minor, _ = strconv.Atoi(versionElements[1])
  111. }
  112. if versionLen >= 3 {
  113. version.Patch, _ = strconv.Atoi(versionElements[2])
  114. }
  115. return
  116. }