From 2a7a54d18eb414302f0ae37e1a3a9880c32e5efe Mon Sep 17 00:00:00 2001 From: Robert Kaussow Date: Tue, 5 Dec 2023 11:46:02 +0100 Subject: [PATCH] fix: use semver tag helper from plugin lib (#76) BREAKING CHANGE: A strict semver method is now used to automatically generate tags. Git tags that are not strictly semver-compatible will be ignored. --- go.mod | 2 +- go.sum | 7 +- plugin/impl.go | 6 +- plugin/tags.go | 121 -------------------------- plugin/tags_test.go | 207 -------------------------------------------- 5 files changed, 7 insertions(+), 336 deletions(-) delete mode 100644 plugin/tags.go delete mode 100644 plugin/tags_test.go diff --git a/go.mod b/go.mod index c05671d..67da5ae 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.21 require ( github.com/cenkalti/backoff v2.2.1+incompatible - github.com/coreos/go-semver v0.3.1 github.com/rs/zerolog v1.31.0 github.com/thegeeklab/wp-plugin-go v1.1.0 github.com/urfave/cli/v2 v2.26.0 @@ -12,6 +11,7 @@ require ( ) require ( + github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/joho/godotenv v1.5.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect diff --git a/go.sum b/go.sum index 264fee0..df7b9a4 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -32,6 +32,3 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/plugin/impl.go b/plugin/impl.go index 839bcda..f5d9d78 100644 --- a/plugin/impl.go +++ b/plugin/impl.go @@ -10,6 +10,7 @@ import ( "github.com/cenkalti/backoff" "github.com/rs/zerolog/log" + "github.com/thegeeklab/wp-plugin-go/tag" "github.com/thegeeklab/wp-plugin-go/types" "github.com/urfave/cli/v2" "golang.org/x/sys/execabs" @@ -49,13 +50,14 @@ func (p *Plugin) Validate() error { if p.Settings.Build.TagsAuto { // return true if tag event or default branch - if UseDefaultTag( + if tag.IsTaggable( p.Settings.Build.Ref, p.Settings.Build.Branch, ) { - tag, err := DefaultTagSuffix( + tag, err := tag.SemverTagSuffix( p.Settings.Build.Ref, p.Settings.Build.TagsSuffix, + true, ) if err != nil { return fmt.Errorf("cannot generate tags from %s, invalid semantic version: %w", p.Settings.Build.Ref, err) diff --git a/plugin/tags.go b/plugin/tags.go deleted file mode 100644 index 404a713..0000000 --- a/plugin/tags.go +++ /dev/null @@ -1,121 +0,0 @@ -package plugin - -import ( - "fmt" - "strings" - - "github.com/coreos/go-semver/semver" -) - -// DefaultTagSuffix returns a set of default suggested tags -// based on the commit ref with an attached suffix. -func DefaultTagSuffix(ref, suffix string) ([]string, error) { - tags, err := DefaultTags(ref) - if err != nil { - return nil, err - } - - if len(suffix) == 0 { - return tags, nil - } - - for i, tag := range tags { - if tag == "latest" { - tags[i] = suffix - } else { - tags[i] = fmt.Sprintf("%s-%s", tag, suffix) - } - } - - return tags, nil -} - -func splitOff(input, delim string) string { - const splits = 2 - parts := strings.SplitN(input, delim, splits) - - if len(parts) == splits { - return parts[0] - } - - return input -} - -// DefaultTags returns a set of default suggested tags based on -// the commit ref. -func DefaultTags(ref string) ([]string, error) { - if !strings.HasPrefix(ref, "refs/tags/") { - return []string{"latest"}, nil - } - - rawVersion := stripTagPrefix(ref) - - version, err := semver.NewVersion(rawVersion) - if err != nil { - return []string{"latest"}, err - } - - if version.PreRelease != "" { - return []string{ - version.String(), - }, nil - } - - rawVersion = stripTagPrefix(ref) - rawVersion = splitOff(splitOff(rawVersion, "+"), "-") - //nolint:gomnd - dotParts := strings.SplitN(rawVersion, ".", 3) - - if version.Major == 0 { - return []string{ - fmt.Sprintf("%0*d.%0*d", len(dotParts[0]), version.Major, len(dotParts[1]), version.Minor), - fmt.Sprintf( - "%0*d.%0*d.%0*d", - len(dotParts[0]), - version.Major, - len(dotParts[1]), - version.Minor, - len(dotParts[2]), - version.Patch, - ), - }, nil - } - - return []string{ - fmt.Sprintf("%0*d", len(dotParts[0]), version.Major), - fmt.Sprintf("%0*d.%0*d", len(dotParts[0]), version.Major, len(dotParts[1]), version.Minor), - fmt.Sprintf( - "%0*d.%0*d.%0*d", - len(dotParts[0]), - version.Major, - len(dotParts[1]), - version.Minor, - len(dotParts[2]), - version.Patch, - ), - }, nil -} - -// UseDefaultTag to keep only default branch for latest tag. -func UseDefaultTag(ref, defaultBranch string) bool { - if strings.HasPrefix(ref, "refs/tags/") { - return true - } - - if stripHeadPrefix(ref) == defaultBranch { - return true - } - - return false -} - -func stripHeadPrefix(ref string) string { - return strings.TrimPrefix(ref, "refs/heads/") -} - -func stripTagPrefix(ref string) string { - ref = strings.TrimPrefix(ref, "refs/tags/") - ref = strings.TrimPrefix(ref, "v") - - return ref -} diff --git a/plugin/tags_test.go b/plugin/tags_test.go deleted file mode 100644 index 5f7df4e..0000000 --- a/plugin/tags_test.go +++ /dev/null @@ -1,207 +0,0 @@ -package plugin - -import ( - "reflect" - "testing" -) - -func Test_stripTagPrefix(t *testing.T) { - tests := []struct { - Before string - After string - }{ - {"refs/tags/1.0.0", "1.0.0"}, - {"refs/tags/v1.0.0", "1.0.0"}, - {"v1.0.0", "1.0.0"}, - } - - for _, test := range tests { - got, want := stripTagPrefix(test.Before), test.After - if got != want { - t.Errorf("Got tag %s, want %s", got, want) - } - } -} - -func TestDefaultTags(t *testing.T) { - tests := []struct { - Before string - After []string - }{ - {"", []string{"latest"}}, - {"refs/heads/main", []string{"latest"}}, - {"refs/tags/0.9.0", []string{"0.9", "0.9.0"}}, - {"refs/tags/1.0.0", []string{"1", "1.0", "1.0.0"}}, - {"refs/tags/v1.0.0+meta", []string{"1", "1.0", "1.0.0"}}, - {"refs/tags/v1.0.0", []string{"1", "1.0", "1.0.0"}}, - {"refs/tags/v1.0.0-alpha.1", []string{"1.0.0-alpha.1"}}, - {"refs/tags/v1.0.0-alpha", []string{"1.0.0-alpha"}}, - } - - for _, test := range tests { - tags, err := DefaultTags(test.Before) - if err != nil { - t.Error(err) - - continue - } - - got, want := tags, test.After - if !reflect.DeepEqual(got, want) { - t.Errorf("Got tag %v, want %v", got, want) - } - } -} - -func TestDefaultTagsError(t *testing.T) { - tests := []string{ - "refs/tags/x1.0.0", - "refs/tags/20190203", - } - - for _, test := range tests { - _, err := DefaultTags(test) - if err == nil { - t.Errorf("Expect tag error for %s", test) - } - } -} - -func TestDefaultTagSuffix(t *testing.T) { - tests := []struct { - Before string - Suffix string - After []string - }{ - // without suffix - { - After: []string{"latest"}, - }, - { - Before: "refs/tags/v1.0.0", - After: []string{ - "1", - "1.0", - "1.0.0", - }, - }, - // with suffix - { - Suffix: "linux-amd64", - After: []string{"linux-amd64"}, - }, - { - Before: "refs/tags/v1.0.0", - Suffix: "linux-amd64", - After: []string{ - "1-linux-amd64", - "1.0-linux-amd64", - "1.0.0-linux-amd64", - }, - }, - { - Suffix: "nanoserver", - After: []string{"nanoserver"}, - }, - { - Before: "refs/tags/v1.9.2", - Suffix: "nanoserver", - After: []string{ - "1-nanoserver", - "1.9-nanoserver", - "1.9.2-nanoserver", - }, - }, - { - Before: "refs/tags/v18.06.0", - Suffix: "nanoserver", - After: []string{ - "18-nanoserver", - "18.06-nanoserver", - "18.06.0-nanoserver", - }, - }, - } - - for _, test := range tests { - tag, err := DefaultTagSuffix(test.Before, test.Suffix) - if err != nil { - t.Error(err) - - continue - } - - got, want := tag, test.After - if !reflect.DeepEqual(got, want) { - t.Errorf("Got tag %v, want %v", got, want) - } - } -} - -func Test_stripHeadPrefix(t *testing.T) { - type args struct { - ref string - } - - tests := []struct { - args args - want string - }{ - { - args: args{ - ref: "refs/heads/main", - }, - want: "main", - }, - } - - for _, tt := range tests { - if got := stripHeadPrefix(tt.args.ref); got != tt.want { - t.Errorf("stripHeadPrefix() = %v, want %v", got, tt.want) - } - } -} - -func TestUseDefaultTag(t *testing.T) { - type args struct { - ref string - defaultBranch string - } - - tests := []struct { - name string - args args - want bool - }{ - { - name: "latest tag for default branch", - args: args{ - ref: "refs/heads/main", - defaultBranch: "main", - }, - want: true, - }, - { - name: "build from tags", - args: args{ - ref: "refs/tags/v1.0.0", - defaultBranch: "main", - }, - want: true, - }, - { - name: "skip build for not default branch", - args: args{ - ref: "refs/heads/develop", - defaultBranch: "main", - }, - want: false, - }, - } - - for _, tt := range tests { - if got := UseDefaultTag(tt.args.ref, tt.args.defaultBranch); got != tt.want { - t.Errorf("%q. UseDefaultTag() = %v, want %v", tt.name, got, tt.want) - } - } -}