From a8eab7a2c54e339d71a8beddcb4f5350cb92ae3d Mon Sep 17 00:00:00 2001 From: Mathieu St-Vincent <6082025+mats852@users.noreply.github.com> Date: Wed, 6 Jul 2022 14:07:06 -0400 Subject: [PATCH] feat: add `strip_v_tag_prefix` config option --- pkg/provider/gitlab.go | 29 ++++++++++++++++++++--------- pkg/provider/gitlab_test.go | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/pkg/provider/gitlab.go b/pkg/provider/gitlab.go index c5c808f..c1ef410 100644 --- a/pkg/provider/gitlab.go +++ b/pkg/provider/gitlab.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "regexp" + "strconv" "github.com/Masterminds/semver/v3" "github.com/go-semantic-release/semantic-release/v2/pkg/provider" @@ -15,9 +16,10 @@ import ( var PVERSION = "dev" type GitLabRepository struct { - projectID string - branch string - client *gitlab.Client + projectID string + branch string + stripVTagPrefix bool + client *gitlab.Client } func (repo *GitLabRepository) Init(config map[string]string) error { @@ -47,14 +49,18 @@ func (repo *GitLabRepository) Init(config map[string]string) error { return fmt.Errorf("gitlab_projectid is required") } + var err error + stripVTagPrefix := config["strip_v_tag_prefix"] + repo.stripVTagPrefix, err = strconv.ParseBool(stripVTagPrefix) + + if stripVTagPrefix != "" && err != nil { + return fmt.Errorf("failed to set property strip_v_tag_prefix: %w", err) + } + repo.projectID = projectID repo.branch = branch - var ( - client *gitlab.Client - err error - ) - + var client *gitlab.Client if gitlabBaseUrl != "" { client, err = gitlab.NewClient(token, gitlab.WithBaseURL(gitlabBaseUrl)) } else { @@ -166,7 +172,12 @@ func (repo *GitLabRepository) GetReleases(rawRe string) ([]*semrel.Release, erro } func (repo *GitLabRepository) CreateRelease(release *provider.CreateReleaseConfig) error { - tag := fmt.Sprintf("v%s", release.NewVersion) + prefix := "v" + if repo.stripVTagPrefix { + prefix = "" + } + + tag := prefix + release.NewVersion // Gitlab does not have any notion of pre-releases _, _, err := repo.client.Releases.CreateRelease(repo.projectID, &gitlab.CreateReleaseOptions{ diff --git a/pkg/provider/gitlab_test.go b/pkg/provider/gitlab_test.go index 1381dd0..c5dd9d7 100644 --- a/pkg/provider/gitlab_test.go +++ b/pkg/provider/gitlab_test.go @@ -14,6 +14,11 @@ import ( "github.com/xanzy/go-gitlab" ) +var validTags = map[string]bool{ + "v2.0.0": true, + "2.0.0": true, +} + func TestNewGitlabRepository(t *testing.T) { require := require.New(t) @@ -31,9 +36,10 @@ func TestNewGitlabRepository(t *testing.T) { repo = &GitLabRepository{} err = repo.Init(map[string]string{ - "gitlab_baseurl": "https://mygitlab.com", - "token": "token", - "gitlab_projectid": "1", + "gitlab_baseurl": "https://mygitlab.com", + "token": "token", + "gitlab_projectid": "1", + "strip_v_tag_prefix": "true", }) require.NoError(err) require.Equal("https://mygitlab.com/api/v4/", repo.client.BaseURL().String(), "invalid custom instance initialization") @@ -102,10 +108,12 @@ func GitlabHandler(w http.ResponseWriter, r *http.Request) { var data map[string]string json.NewDecoder(r.Body).Decode(&data) r.Body.Close() - if data["tag_name"] != "v2.0.0" { + + if _, ok := validTags[data["tag_name"]]; !ok { http.Error(w, "invalid tag name", http.StatusBadRequest) return } + fmt.Fprint(w, "{}") return } @@ -184,3 +192,22 @@ func TestGitlabCreateRelease(t *testing.T) { err := repo.CreateRelease(&provider.CreateReleaseConfig{NewVersion: "2.0.0", SHA: "deadbeef"}) require.NoError(t, err) } + +func TestGitlabStripVTagRelease(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(GitlabHandler)) + defer ts.Close() + + repo := &GitLabRepository{} + err := repo.Init(map[string]string{ + "gitlab_baseurl": ts.URL, + "token": "gitlab-examples-ci", + "gitlab_branch": "", + "gitlab_projectid": strconv.Itoa(GITLAB_PROJECT_ID), + "strip_v_tag_prefix": "true", + }) + + require.NoError(t, err) + + err = repo.CreateRelease(&provider.CreateReleaseConfig{NewVersion: "2.0.0", SHA: "deadbeef"}) + require.NoError(t, err) +} -- GitLab