github.com/webx-top/com@v1.2.12/compare.go (about)

     1  /*
     2    Copyright 2015 Adrian Stanescu. All rights reserved.
     3    Use of this source code is governed by the MIT License (MIT) that can be found in the LICENSE file.
     4  
     5    Go program that compares software versions in the x.y.z format
     6    Usage:
     7    x := "1"
     8    y := "1.0.1"
     9    z := "1.0"
    10    fmt.Println(VersionCompare(x, y)) // 1 = y
    11    fmt.Println(VersionCompare(x, z)) // 0 = equal
    12    fmt.Println(VersionCompare(x, a)) // -1 = x
    13  */
    14  
    15  package com
    16  
    17  import (
    18  	"log"
    19  
    20  	"github.com/hashicorp/go-version"
    21  )
    22  
    23  const (
    24  	// VersionCompareGt 左大于右
    25  	VersionCompareGt = 1
    26  	// VersionCompareEq 左等于右
    27  	VersionCompareEq = 0
    28  	// VersionCompareLt 左小于右
    29  	VersionCompareLt = -1
    30  )
    31  
    32  func SemVerCompare(a, b string) (int, error) {
    33  	v1, err := version.NewVersion(a)
    34  	if err != nil {
    35  		return 0, err
    36  	}
    37  
    38  	v2, err := version.NewVersion(b)
    39  	if err != nil {
    40  		return 0, err
    41  	}
    42  
    43  	return v1.Compare(v2), nil
    44  }
    45  
    46  // VersionCompare compare two versions in x.y.z form
    47  // @param  {string} a     version string
    48  // @param  {string} b     version string
    49  // @return {int}          1 = a is higher, 0 = equal, -1 = b is higher
    50  func VersionCompare(a, b string) (ret int) {
    51  	var err error
    52  	ret, err = SemVerCompare(a, b)
    53  	if err != nil {
    54  		log.Printf(`failed to VersionCompare(%q, %q): %v`, a, b, err)
    55  	}
    56  	return
    57  }
    58  
    59  // VersionComparex compare two versions in x.y.z form
    60  // @param  {string} a     version string
    61  // @param  {string} b     version string
    62  // @param  {string} op    <,<=,>,>=,= or lt,le,elt,gt,ge,egt,eq
    63  // @return {bool}
    64  func VersionComparex(a, b string, op string) bool {
    65  	switch op {
    66  	case `<`, `lt`:
    67  		return VersionCompare(a, b) == VersionCompareLt
    68  	case `<=`, `le`, `elt`:
    69  		r := VersionCompare(a, b)
    70  		return r == VersionCompareLt || r == VersionCompareEq
    71  	case `>`, `gt`:
    72  		return VersionCompare(a, b) == VersionCompareGt
    73  	case `>=`, `ge`, `egt`:
    74  		r := VersionCompare(a, b)
    75  		return r == VersionCompareGt || r == VersionCompareEq
    76  	case `=`, `eq`:
    77  		return VersionCompare(a, b) == VersionCompareEq
    78  	default:
    79  		return false
    80  	}
    81  }