github.com/gogf/gf@v1.16.9/text/gstr/gstr_version.go (about)

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