From 750e5df9622a0e5a67b138645ec21ee1037f0d05 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 15 May 2020 23:42:17 +0800 Subject: [PATCH] improve gstr.CompareVersion --- text/gstr/gstr.go | 30 ++++++++++++++++++++++++++++- text/gstr/gstr_z_unit_basic_test.go | 13 +++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/text/gstr/gstr.go b/text/gstr/gstr.go index 21d6e207d..9ff40d6ce 100644 --- a/text/gstr/gstr.go +++ b/text/gstr/gstr.go @@ -687,7 +687,17 @@ func InArray(a []string, s string) bool { } // CompareVersion compares and as standard golang version. -// Golang standard version is as: 1.0.0, v1.0.1, v2.10.8, 10.2.0 etc. +// It returns 1 if > . +// It returns -1 if < . +// It returns 0 if = . +// Golang standard version is like: +// 1.0.0 +// v1.0.1 +// v2.10.8 +// 10.2.0 +// v0.0.0-20190626092158-b2ccc519800e +// v4.20.0+incompatible +// etc. func CompareVersion(a, b string) int { if a[0] == 'v' { a = a[1:] @@ -695,6 +705,24 @@ func CompareVersion(a, b string) int { if b[0] == 'v' { b = b[1:] } + if Count(a, "-") > 1 { + if i := PosR(a, "-"); i > 0 { + a = a[:i] + } + } + if Count(b, "-") > 1 { + if i := PosR(b, "-"); i > 0 { + b = b[:i] + } + } + if i := Pos(a, "+"); i > 0 { + a = a[:i] + } + if i := Pos(b, "+"); i > 0 { + b = b[:i] + } + a = Replace(a, "-", ".") + b = Replace(b, "-", ".") array1 := strings.Split(a, ".") array2 := strings.Split(b, ".") for i := 0; i < len(array2)-len(array1); i++ { diff --git a/text/gstr/gstr_z_unit_basic_test.go b/text/gstr/gstr_z_unit_basic_test.go index 401011ff2..ad8aa02ca 100644 --- a/text/gstr/gstr_z_unit_basic_test.go +++ b/text/gstr/gstr_z_unit_basic_test.go @@ -458,3 +458,16 @@ func Test_InArray(t *testing.T) { t.AssertEQ(gstr.InArray(a, "d"), false) }) } + +func Test_CompareVersion(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + t.AssertEQ(gstr.CompareVersion("v1.0.1", "v1.1.0"), -1) + t.AssertEQ(gstr.CompareVersion("1.0.1", "v1.1.0"), -1) + t.AssertEQ(gstr.CompareVersion("1.0.0", "v0.1.0"), 1) + t.AssertEQ(gstr.CompareVersion("1.0.0", "v1.0.0"), 0) + t.AssertEQ(gstr.CompareVersion("v0.0.0-20190626092158-b2ccc519800e", "0.0.0-20190626092158"), 0) + t.AssertEQ(gstr.CompareVersion("v0.0.0-20190626092159-b2ccc519800e", "0.0.0-20190626092158"), 1) + t.AssertEQ(gstr.CompareVersion("v4.20.0+incompatible", "4.20.0"), 0) + t.AssertEQ(gstr.CompareVersion("v4.20.0+incompatible", "4.20.1"), -1) + }) +}