gstr_version.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright 2020 gf Author(https://github.com/gogf/gf). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. package gstr
  7. import (
  8. "github.com/gogf/gf/util/gconv"
  9. "strings"
  10. )
  11. // CompareVersion compares <a> and <b> as standard GNU version.
  12. // It returns 1 if <a> > <b>.
  13. // It returns -1 if <a> < <b>.
  14. // It returns 0 if <a> = <b>.
  15. // GNU standard version is like:
  16. // v1.0
  17. // 1
  18. // 1.0.0
  19. // v1.0.1
  20. // v2.10.8
  21. // 10.2.0
  22. // etc.
  23. func CompareVersion(a, b string) int {
  24. if a[0] == 'v' {
  25. a = a[1:]
  26. }
  27. if b[0] == 'v' {
  28. b = b[1:]
  29. }
  30. var (
  31. array1 = strings.Split(a, ".")
  32. array2 = strings.Split(b, ".")
  33. diff = 0
  34. )
  35. diff = len(array2) - len(array1)
  36. for i := 0; i < diff; i++ {
  37. array1 = append(array1, "0")
  38. }
  39. diff = len(array1) - len(array2)
  40. for i := 0; i < diff; i++ {
  41. array2 = append(array2, "0")
  42. }
  43. v1 := 0
  44. v2 := 0
  45. for i := 0; i < len(array1); i++ {
  46. v1 = gconv.Int(array1[i])
  47. v2 = gconv.Int(array2[i])
  48. if v1 > v2 {
  49. return 1
  50. }
  51. if v1 < v2 {
  52. return -1
  53. }
  54. }
  55. return 0
  56. }
  57. // CompareVersionGo compares <a> and <b> as standard Golang version.
  58. // It returns 1 if <a> > <b>.
  59. // It returns -1 if <a> < <b>.
  60. // It returns 0 if <a> = <b>.
  61. // Golang standard version is like:
  62. // 1.0.0
  63. // v1.0.1
  64. // v2.10.8
  65. // 10.2.0
  66. // v0.0.0-20190626092158-b2ccc519800e
  67. // v4.20.0+incompatible
  68. // etc.
  69. func CompareVersionGo(a, b string) int {
  70. if a[0] == 'v' {
  71. a = a[1:]
  72. }
  73. if b[0] == 'v' {
  74. b = b[1:]
  75. }
  76. if Count(a, "-") > 1 {
  77. if i := PosR(a, "-"); i > 0 {
  78. a = a[:i]
  79. }
  80. }
  81. if Count(b, "-") > 1 {
  82. if i := PosR(b, "-"); i > 0 {
  83. b = b[:i]
  84. }
  85. }
  86. if i := Pos(a, "+"); i > 0 {
  87. a = a[:i]
  88. }
  89. if i := Pos(b, "+"); i > 0 {
  90. b = b[:i]
  91. }
  92. a = Replace(a, "-", ".")
  93. b = Replace(b, "-", ".")
  94. var (
  95. array1 = strings.Split(a, ".")
  96. array2 = strings.Split(b, ".")
  97. diff = 0
  98. )
  99. // Specially in Golang:
  100. // "v1.12.2-0.20200413154443-b17e3a6804fa" < "v1.12.2"
  101. if len(array1) > 3 && len(array2) <= 3 {
  102. return -1
  103. }
  104. if len(array1) <= 3 && len(array2) > 3 {
  105. return 1
  106. }
  107. diff = len(array2) - len(array1)
  108. for i := 0; i < diff; i++ {
  109. array1 = append(array1, "0")
  110. }
  111. diff = len(array1) - len(array2)
  112. for i := 0; i < diff; i++ {
  113. array2 = append(array2, "0")
  114. }
  115. v1 := 0
  116. v2 := 0
  117. for i := 0; i < len(array1); i++ {
  118. v1 = gconv.Int(array1[i])
  119. v2 = gconv.Int(array2[i])
  120. if v1 > v2 {
  121. return 1
  122. }
  123. if v1 < v2 {
  124. return -1
  125. }
  126. }
  127. return 0
  128. }