github.com/lingyao2333/mo-zero@v1.4.1/core/utils/version.go (about)

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