1
0

version.go 1022 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // Package version compares 3x-ui release versions ("v3.8.0" or "3.8.0").
  2. package version
  3. import (
  4. "strconv"
  5. "strings"
  6. )
  7. // Compare returns -1, 0 or 1 as a is older than, equal to or newer than b, and
  8. // false when either side is not a plain MAJOR.MINOR.PATCH version.
  9. func Compare(a, b string) (int, bool) {
  10. aParts, okA := parse(a)
  11. bParts, okB := parse(b)
  12. if !okA || !okB {
  13. return 0, false
  14. }
  15. for i := range len(aParts) {
  16. if aParts[i] > bParts[i] {
  17. return 1, true
  18. }
  19. if aParts[i] < bParts[i] {
  20. return -1, true
  21. }
  22. }
  23. return 0, true
  24. }
  25. // Normalize strips surrounding space and a leading "v" from a version tag.
  26. func Normalize(v string) string {
  27. return strings.TrimPrefix(strings.TrimSpace(v), "v")
  28. }
  29. func parse(v string) ([3]int, bool) {
  30. var result [3]int
  31. parts := strings.Split(Normalize(v), ".")
  32. if len(parts) != 3 {
  33. return result, false
  34. }
  35. for i, part := range parts {
  36. n, err := strconv.Atoi(part)
  37. if err != nil {
  38. return result, false
  39. }
  40. result[i] = n
  41. }
  42. return result, true
  43. }