version.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package utils
  2. import (
  3. "strconv"
  4. "strings"
  5. )
  6. // returns -1 if the first version is lower than the second, 0 if they are equal, and 1 if the second is lower.
  7. func CompareVersions(a, b string) int {
  8. as := strings.Split(a, ".")
  9. bs := strings.Split(b, ".")
  10. var loop int
  11. if len(as) > len(bs) {
  12. loop = len(as)
  13. } else {
  14. loop = len(bs)
  15. }
  16. for i := 0; i < loop; i++ {
  17. var x, y string
  18. if len(as) > i {
  19. x = as[i]
  20. }
  21. if len(bs) > i {
  22. y = bs[i]
  23. }
  24. xi, _ := strconv.Atoi(x)
  25. yi, _ := strconv.Atoi(y)
  26. if xi > yi {
  27. return 1
  28. } else if xi < yi {
  29. return -1
  30. }
  31. }
  32. return 0
  33. }
  34. //return 0 if they are equal,and 1 if v1>2,and 2 if v1<v2
  35. func Compare(v1, v2 string) int {
  36. replaceMap := map[string]string{"V": "", "v": "", "-": "."}
  37. for k, v := range replaceMap {
  38. if strings.Contains(v1, k) {
  39. strings.Replace(v1, k, v, -1)
  40. }
  41. if strings.Contains(v2, k) {
  42. strings.Replace(v2, k, v, -1)
  43. }
  44. }
  45. verStr1 := strings.Split(v1, ".")
  46. verStr2 := strings.Split(v2, ".")
  47. ver1 := strSlice2IntSlice(verStr1)
  48. ver2 := strSlice2IntSlice(verStr2)
  49. var shorter int
  50. if len(ver1) > len(ver2) {
  51. shorter = len(ver2)
  52. } else {
  53. shorter = len(ver1)
  54. }
  55. for i := 0; i < shorter; i++ {
  56. if ver1[i] == ver2[i] {
  57. if shorter-1 == i {
  58. if len(ver1) == len(ver2) {
  59. return 0
  60. } else {
  61. if len(ver1) > len(ver2) {
  62. return 1
  63. } else {
  64. return 2
  65. }
  66. }
  67. }
  68. } else if ver1[i] > ver2[i] {
  69. return 1
  70. } else {
  71. return 2
  72. }
  73. }
  74. return -1
  75. }
  76. func strSlice2IntSlice(strs []string) []int64 {
  77. if len(strs) == 0 {
  78. return []int64{}
  79. }
  80. retInt := make([]int64, 0, len(strs))
  81. for _, str := range strs {
  82. i, err := strconv.ParseInt(str, 10, 64)
  83. if err == nil {
  84. retInt = append(retInt, i)
  85. }
  86. }
  87. return retInt
  88. }
  89. //custom operator compare
  90. func CustomCompareVersions(v1, v2, operator string) bool {
  91. com := Compare(v1, v2)
  92. switch operator {
  93. case "==":
  94. if com == 0 {
  95. return true
  96. }
  97. case "<":
  98. if com == 2 {
  99. return true
  100. }
  101. case ">":
  102. if com == 1 {
  103. return true
  104. }
  105. case "<=":
  106. if com == 0 || com == 2 {
  107. return true
  108. }
  109. case ">=":
  110. if com == 0 || com == 1 {
  111. return true
  112. }
  113. }
  114. return false
  115. }