Projects STRLCPY afrog Commits 269b2369
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■
    pkg/upgrade/upgrade.go
    skipped 52 lines
    53 53   u.CurrVersion = curVersion
    54 54   u.RemoteVersion = strings.TrimSpace(string(remoteVersion))
    55 55   
    56  - return strings.TrimSpace(string(remoteVersion)) > curVersion, nil
     56 + return utils.Compare(strings.TrimSpace(string(remoteVersion)), ">", curVersion), nil
    57 57  }
    58 58   
    59 59  func (u *Upgrade) UpgradeAfrogPocs() {
    skipped 43 lines
  • ■ ■ ■ ■ ■ ■
    pkg/utils/version.go
     1 +package utils
     2 + 
     3 +import (
     4 + "log"
     5 + "strconv"
     6 + "strings"
     7 +)
     8 + 
     9 +// reference : https://github.com/michelia/uversion/blob/a1caf6fb6aad0a4e92b2c51e097f33518e2ff8da/version_compare.go
     10 + 
     11 +// vCompareSlice operator为 < <= > >= = ==
     12 +func vCompareSlice(v1s []string, operator string, v2s []string) bool {
     13 + switch operator {
     14 + case "<", "<=", ">", ">=", "==":
     15 + default:
     16 + log.Print("不合法的比较符")
     17 + return false
     18 + }
     19 + l := len(v1s)
     20 + switch {
     21 + case len(v1s) > len(v2s):
     22 + l = len(v1s)
     23 + diff := len(v1s) - len(v2s)
     24 + for i := 0; i < diff; i++ {
     25 + v2s = append(v2s, "0")
     26 + }
     27 + case len(v1s) < len(v2s):
     28 + l = len(v2s)
     29 + diff := len(v2s) - len(v1s)
     30 + for i := 0; i < diff; i++ {
     31 + v1s = append(v1s, "0")
     32 + }
     33 + }
     34 + switch operator {
     35 + case "==":
     36 + if strings.Join(v1s, ".") == strings.Join(v2s, ".") {
     37 + return true
     38 + } else {
     39 + return false
     40 + }
     41 + case ">=", "<=":
     42 + operator = string(operator[0]) // 只取 < 或 >
     43 + // 因为 operator 包含 =
     44 + if strings.Join(v1s, ".") == strings.Join(v2s, ".") {
     45 + return true
     46 + }
     47 + }
     48 + 
     49 + for i := 0; i < l; i++ {
     50 + fs := false // fs flag string 表示是字符, 不能转化为int
     51 + n1, err := strconv.Atoi(v1s[i])
     52 + if err != nil {
     53 + fs = true
     54 + }
     55 + n2, err := strconv.Atoi(v2s[i])
     56 + if err != nil {
     57 + fs = true
     58 + }
     59 + switch operator {
     60 + case "<":
     61 + if fs {
     62 + switch {
     63 + case v1s[i] == v2s[i]:
     64 + continue
     65 + case v1s[i] < v2s[i]:
     66 + return true
     67 + case v1s[i] > v2s[i]:
     68 + return false
     69 + }
     70 + } else {
     71 + switch {
     72 + case n1 == n2:
     73 + continue
     74 + case n1 < n2:
     75 + return true
     76 + case n1 > n2:
     77 + return false
     78 + }
     79 + }
     80 + case ">":
     81 + if fs {
     82 + switch {
     83 + case v1s[i] == v2s[i]:
     84 + continue
     85 + case v1s[i] > v2s[i]:
     86 + return true
     87 + case v1s[i] < v2s[i]:
     88 + return false
     89 + }
     90 + } else {
     91 + switch {
     92 + case n1 == n2:
     93 + continue
     94 + case n1 > n2:
     95 + return true
     96 + case n1 < n2:
     97 + return false
     98 + }
     99 + }
     100 + }
     101 + }
     102 + return false
     103 +}
     104 + 
     105 +// Compare operator为 < <= > >= ==
     106 +func Compare(v1, operator, v2 string) bool {
     107 + v1s := strings.Split(v1, ".")
     108 + v2s := strings.Split(v2, ".")
     109 + return vCompareSlice(v1s, operator, v2s)
     110 +}
     111 + 
     112 +// Between operator为 < <= > >= ==
     113 +func Between(v1, o1, v, o2, v2 string) bool {
     114 + v1s := strings.Split(v1, ".")
     115 + vs := strings.Split(v, ".")
     116 + v2s := strings.Split(v2, ".")
     117 + if vCompareSlice(v1s, o1, vs) && vCompareSlice(vs, o2, v2s) {
     118 + return true
     119 + }
     120 + return false
     121 +}
     122 + 
Please wait...
Page is in error, reload to recover