version.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package utils
  2. import (
  3. "strconv"
  4. "strings"
  5. "github.com/wuntsong-org/go-zero-plus/core/mathx"
  6. "github.com/wuntsong-org/go-zero-plus/core/stringx"
  7. )
  8. var replacer = stringx.NewReplacer(map[string]string{
  9. "V": "",
  10. "v": "",
  11. "-": ".",
  12. })
  13. // CompareVersions returns true if the first field and the third field are equal, otherwise false.
  14. func CompareVersions(v1, op, v2 string) bool {
  15. result := compare(v1, v2)
  16. switch op {
  17. case "=", "==":
  18. return result == 0
  19. case "<":
  20. return result == -1
  21. case ">":
  22. return result == 1
  23. case "<=":
  24. return result == -1 || result == 0
  25. case ">=":
  26. return result == 0 || result == 1
  27. }
  28. return false
  29. }
  30. // return -1 if v1<v2, 0 if they are equal, and 1 if v1>v2
  31. func compare(v1, v2 string) int {
  32. v1, v2 = replacer.Replace(v1), replacer.Replace(v2)
  33. fields1, fields2 := strings.Split(v1, "."), strings.Split(v2, ".")
  34. ver1, ver2 := strsToInts(fields1), strsToInts(fields2)
  35. ver1len, ver2len := len(ver1), len(ver2)
  36. shorter := mathx.MinInt(ver1len, ver2len)
  37. for i := 0; i < shorter; i++ {
  38. if ver1[i] == ver2[i] {
  39. continue
  40. } else if ver1[i] < ver2[i] {
  41. return -1
  42. } else {
  43. return 1
  44. }
  45. }
  46. if ver1len < ver2len {
  47. return -1
  48. } else if ver1len == ver2len {
  49. return 0
  50. } else {
  51. return 1
  52. }
  53. }
  54. func strsToInts(strs []string) []int64 {
  55. if len(strs) == 0 {
  56. return nil
  57. }
  58. ret := make([]int64, 0, len(strs))
  59. for _, str := range strs {
  60. i, _ := strconv.ParseInt(str, 10, 64)
  61. ret = append(ret, i)
  62. }
  63. return ret
  64. }