From 73dd2d3cf36ad21490e8b0cefd76e3af3b9a0811 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Mon, 4 Dec 2023 13:37:22 -0800 Subject: [PATCH] chore: Use golang.org/x/mod/semver for version parsing --- go.mod | 1 + go.sum | 2 ++ pkg/controller/metadata.go | 31 +------------------------------ pkg/controller/metadata_test.go | 6 +++--- pkg/gitlab/jobs_test.go | 4 ++-- pkg/gitlab/version.go | 32 +++++++++++++++++++++----------- pkg/gitlab/version_test.go | 22 ++++++++++++++++------ 7 files changed, 46 insertions(+), 52 deletions(-) diff --git a/go.mod b/go.mod index cea64cc3..dc157dd6 100644 --- a/go.mod +++ b/go.mod @@ -93,6 +93,7 @@ require ( go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect golang.org/x/crypto v0.16.0 // indirect + golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect golang.org/x/sync v0.5.0 // indirect diff --git a/go.sum b/go.sum index fa5b3d92..62f8c347 100644 --- a/go.sum +++ b/go.sum @@ -227,6 +227,8 @@ golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= diff --git a/pkg/controller/metadata.go b/pkg/controller/metadata.go index 55d71364..f2485c2f 100644 --- a/pkg/controller/metadata.go +++ b/pkg/controller/metadata.go @@ -2,33 +2,12 @@ package controller import ( "context" - "regexp" - "strconv" goGitlab "github.com/xanzy/go-gitlab" "github.com/mvisonneau/gitlab-ci-pipelines-exporter/pkg/gitlab" ) -func parseVersionRegex(version string) (int, int, int, string) { - regexPattern := `^(\d+)\.(\d+)\.(\d+)(?:-(.*))?$` - r := regexp.MustCompile(regexPattern) - - matches := r.FindStringSubmatch(version) - - if matches == nil { - return 0, 0, 0, "Invalid version format" - } - - major, _ := strconv.Atoi(matches[1]) - minor, _ := strconv.Atoi(matches[2]) - patch, _ := strconv.Atoi(matches[3]) - - suffix := matches[4] - - return major, minor, patch, suffix -} - func (c *Controller) GetGitLabMetadata(ctx context.Context) error { options := []goGitlab.RequestOptionFunc{goGitlab.WithContext(ctx)} @@ -38,15 +17,7 @@ func (c *Controller) GetGitLabMetadata(ctx context.Context) error { } if metadata.Version != "" { - major, minor, patch, suffix := parseVersionRegex(metadata.Version) - c.Gitlab.UpdateVersion( - gitlab.GitLabVersion{ - Major: major, - Minor: minor, - Patch: patch, - Suffix: suffix, - }, - ) + c.Gitlab.UpdateVersion(gitlab.NewGitLabVersion(metadata.Version)) } return nil diff --git a/pkg/controller/metadata_test.go b/pkg/controller/metadata_test.go index eb463b31..5fe830f0 100644 --- a/pkg/controller/metadata_test.go +++ b/pkg/controller/metadata_test.go @@ -31,16 +31,16 @@ func TestGetGitLabMetadataSuccess(t *testing.T) { "enterprise":true } `, - expectedVersion: gitlab.GitLabVersion{Major: 16, Minor: 7, Patch: 0, Suffix: "pre"}, + expectedVersion: gitlab.NewGitLabVersion("v16.7.0-pre"), }, { name: "unsuccessful parse", data: ` { -"version":"16.7" +"revision":"3fe364fe754" } `, - expectedVersion: gitlab.GitLabVersion{Major: 0, Minor: 0, Patch: 0, Suffix: "Invalid version format"}, + expectedVersion: gitlab.NewGitLabVersion(""), }, } diff --git a/pkg/gitlab/jobs_test.go b/pkg/gitlab/jobs_test.go index 1d49a512..93b28813 100644 --- a/pkg/gitlab/jobs_test.go +++ b/pkg/gitlab/jobs_test.go @@ -161,9 +161,9 @@ func TestListRefMostRecentJobs(t *testing.T) { defer server.Close() if tc.keysetPagination { - c.UpdateVersion(GitLabVersion{Major: 16, Minor: 0}) + c.UpdateVersion(NewGitLabVersion("16.0.0")) } else { - c.UpdateVersion(GitLabVersion{Major: 15, Minor: 0}) + c.UpdateVersion(NewGitLabVersion("15.0.0")) } ref := schemas.Ref{ diff --git a/pkg/gitlab/version.go b/pkg/gitlab/version.go index f42d6f5d..efb5dcfb 100644 --- a/pkg/gitlab/version.go +++ b/pkg/gitlab/version.go @@ -1,22 +1,32 @@ package gitlab +import ( + "strings" + + "golang.org/x/mod/semver" +) + type GitLabVersion struct { - Major int - Minor int - Patch int - Suffix string + Version string +} + +func NewGitLabVersion(version string) GitLabVersion { + ver := "" + if strings.HasPrefix(version, "v") { + ver = version + } else if version != "" { + ver = "v" + version + } + + return GitLabVersion{Version: ver} } // PipelineJobsKeysetPaginationSupported returns true if the GitLab instance // is running 15.9 or later. func (v GitLabVersion) PipelineJobsKeysetPaginationSupported() bool { - if v.Major == 0 { + if v.Version == "" { return false - } else if v.Major < 15 { - return false - } else if v.Major > 15 { - return true - } else { - return v.Minor >= 9 } + + return semver.Compare(v.Version, "v15.9.0") >= 0 } diff --git a/pkg/gitlab/version_test.go b/pkg/gitlab/version_test.go index 0ebfd6ee..d12febf4 100644 --- a/pkg/gitlab/version_test.go +++ b/pkg/gitlab/version_test.go @@ -14,32 +14,42 @@ func TestPipelineJobsKeysetPaginationSupported(t *testing.T) { }{ { name: "unknown", - version: GitLabVersion{Major: 0, Minor: 0, Patch: 0, Suffix: ""}, + version: NewGitLabVersion(""), expectedResult: false, }, { name: "15.8.0", - version: GitLabVersion{Major: 15, Minor: 8, Patch: 0, Suffix: ""}, + version: NewGitLabVersion("15.8.0"), + expectedResult: false, + }, + { + name: "v15.8.0", + version: NewGitLabVersion("v15.8.0"), expectedResult: false, }, { name: "15.9.0", - version: GitLabVersion{Major: 15, Minor: 9, Patch: 0, Suffix: ""}, + version: NewGitLabVersion("15.9.0"), + expectedResult: true, + }, + { + name: "v15.9.0", + version: NewGitLabVersion("v15.9.0"), expectedResult: true, }, { name: "15.9.1", - version: GitLabVersion{Major: 15, Minor: 9, Patch: 1, Suffix: ""}, + version: NewGitLabVersion("15.9.1"), expectedResult: true, }, { name: "15.10.2", - version: GitLabVersion{Major: 15, Minor: 10, Patch: 12, Suffix: ""}, + version: NewGitLabVersion("15.10.2"), expectedResult: true, }, { name: "16.0.0", - version: GitLabVersion{Major: 16, Minor: 0, Patch: 0, Suffix: ""}, + version: NewGitLabVersion("16.0.0"), expectedResult: true, }, }