From d7c4fb02392ed62657171234813ad87ed71d2eaf Mon Sep 17 00:00:00 2001 From: Vincent Boutour Date: Wed, 3 Mar 2021 17:58:10 +0100 Subject: [PATCH] feat(semver): Adding support for long prefix for linkerd notably Signed-off-by: Vincent Boutour --- pkg/semver/semver.go | 42 ++++++++++++++++++++++++--------------- pkg/semver/semver_test.go | 16 +++++++++++++++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/pkg/semver/semver.go b/pkg/semver/semver.go index f64ad201..089fb138 100644 --- a/pkg/semver/semver.go +++ b/pkg/semver/semver.go @@ -23,15 +23,16 @@ const ( alpha NonFinalVersion = iota + 1 beta canary + edge rc test ) var ( // According to https://semver.org/#spec-item-11 - semverMatcher = regexp.MustCompile(`(?i)^[a-zA-Z]*([0-9]+)\.([0-9]+)(?:\.([0-9]+))?(-[a-zA-Z0-9.]+)?(?:\+[a-zA-Z0-9.]+)?$`) + semverMatcher = regexp.MustCompile(`(?i)^([a-zA-Z-]*)([0-9]+)\.([0-9]+)(?:\.([0-9]+))?(-[a-zA-Z0-9.]+)?(?:\+[a-zA-Z0-9.]+)?$`) - nonFinalVersions = []string{"alpha", "beta", "canary", "rc", "test"} + nonFinalVersions = []string{"alpha", "beta", "canary", "edge", "rc", "test"} // NoneVersion is the empty semver NoneVersion = Version{} @@ -96,40 +97,49 @@ func Parse(version string) (Version, error) { } semver := Version{ - Name: version, + Name: version, + suffix: parseNonFinalVersion(matches), } var err error - semver.major, err = strconv.ParseUint(matches[1], 10, 64) + semver.major, err = strconv.ParseUint(matches[2], 10, 64) if err != nil { return NoneVersion, fmt.Errorf("version major is not numeric") } - if len(matches[2]) != 0 { - semver.minor, err = strconv.ParseUint(matches[2], 10, 64) + if len(matches[3]) != 0 { + semver.minor, err = strconv.ParseUint(matches[3], 10, 64) if err != nil { return NoneVersion, fmt.Errorf("version minor is not numeric") } } - if len(matches[3]) != 0 { - semver.patch, err = strconv.ParseUint(matches[3], 10, 64) + if len(matches[4]) != 0 { + semver.patch, err = strconv.ParseUint(matches[4], 10, 64) if err != nil { return NoneVersion, fmt.Errorf("version patch is not numeric") } } - if len(matches[4]) != 0 { - for index, nonFinalVersion := range nonFinalVersions { - if strings.Contains(matches[4], nonFinalVersion) { - semver.suffix = NonFinalVersion(index + 1) - } + return semver, nil +} + +func parseNonFinalVersion(matches []string) NonFinalVersion { + if len(matches[1]) <= 1 && len(matches[5]) == 0 { + return -1 + } + + for index, nonFinalVersion := range nonFinalVersions { + if strings.Contains(matches[1], nonFinalVersion) { + return NonFinalVersion(index + 1) + } + + if len(matches[5]) != 0 && strings.Contains(matches[5], nonFinalVersion) { + return NonFinalVersion(index + 1) } - } else { - semver.suffix = -1 } - return semver, nil + return 0 } func safeParse(version string) Version { diff --git a/pkg/semver/semver_test.go b/pkg/semver/semver_test.go index 58cfe5d9..6a596e84 100644 --- a/pkg/semver/semver_test.go +++ b/pkg/semver/semver_test.go @@ -189,6 +189,22 @@ func TestParse(t *testing.T) { NoneVersion, errors.New("unable to parse version"), }, + { + "prefixed version", + args{ + version: "stable-2.10.1", + }, + Version{"stable-2.10.1", 2, 10, 1, 0}, + nil, + }, + { + "edge version", + args{ + version: "edge-2.10.1", + }, + Version{"edge-2.10.1", 2, 10, 1, edge}, + nil, + }, { "flag rc version", args{