diff --git a/text/gstr/gstr_version.go b/text/gstr/gstr_version.go index f5d478c63..6b63cde59 100644 --- a/text/gstr/gstr_version.go +++ b/text/gstr/gstr_version.go @@ -12,6 +12,32 @@ import ( "github.com/gogf/gf/v2/util/gconv" ) +// IsGNUVersion checks and returns whether given `version` is valid GNU version string. +func IsGNUVersion(version string) bool { + if version != "" && (version[0] == 'v' || version[0] == 'V') { + version = version[1:] + } + if version == "" { + return false + } + var array = strings.Split(version, ".") + if len(array) > 3 { + return false + } + for _, v := range array { + if v == "" { + return false + } + if !IsNumeric(v) { + return false + } + if v[0] == '-' || v[0] == '+' { + return false + } + } + return true +} + // CompareVersion compares `a` and `b` as standard GNU version. // It returns 1 if `a` > `b`. // It returns -1 if `a` < `b`. diff --git a/text/gstr/gstr_z_unit_version_test.go b/text/gstr/gstr_z_unit_version_test.go index ff4475d6d..77cefa5a3 100644 --- a/text/gstr/gstr_z_unit_version_test.go +++ b/text/gstr/gstr_z_unit_version_test.go @@ -15,6 +15,23 @@ import ( "github.com/gogf/gf/v2/text/gstr" ) +func Test_IsGNUVersion(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + t.AssertEQ(gstr.IsGNUVersion(""), false) + t.AssertEQ(gstr.IsGNUVersion("v"), false) + t.AssertEQ(gstr.IsGNUVersion("v0"), true) + t.AssertEQ(gstr.IsGNUVersion("v0."), false) + t.AssertEQ(gstr.IsGNUVersion("v1."), false) + t.AssertEQ(gstr.IsGNUVersion("v1.1"), true) + t.AssertEQ(gstr.IsGNUVersion("v1.1.0"), true) + t.AssertEQ(gstr.IsGNUVersion("v1.1."), false) + t.AssertEQ(gstr.IsGNUVersion("v1.1.0.0"), false) + t.AssertEQ(gstr.IsGNUVersion("v0.0.0"), true) + t.AssertEQ(gstr.IsGNUVersion("v1.1.-1"), false) + t.AssertEQ(gstr.IsGNUVersion("v1.1.+1"), false) + }) +} + func Test_CompareVersion(t *testing.T) { gtest.C(t, func(t *gtest.T) { t.AssertEQ(gstr.CompareVersion("1", ""), 1)