Skip to content

Commit eb84677

Browse files
Kola Segunchristophwitzko
authored andcommitted
feat: tag matching
add option to match tags similar to
1 parent b2b6521 commit eb84677

File tree

5 files changed

+50
-17
lines changed

5 files changed

+50
-17
lines changed

cmd/semantic-release/main.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"io/ioutil"
8+
"log"
9+
"os"
10+
"regexp"
11+
"strings"
12+
713
"github.com/go-semantic-release/semantic-release/pkg/condition"
814
"github.com/go-semantic-release/semantic-release/pkg/config"
915
"github.com/go-semantic-release/semantic-release/pkg/semrel"
1016
"github.com/go-semantic-release/semantic-release/pkg/update"
1117
"github.com/urfave/cli/v2"
12-
"io/ioutil"
13-
"log"
14-
"os"
15-
"strings"
1618
)
1719

1820
// SRVERSION is the semantic-release version (added at compile time)
@@ -95,7 +97,13 @@ func cliHandler(c *cli.Context) error {
9597
}
9698

9799
logger.Println("getting latest release...")
98-
release, err := repo.GetLatestRelease(conf.BetaRelease.MaintainedVersion)
100+
var matchRegex *regexp.Regexp
101+
match := strings.TrimSpace(conf.Match)
102+
if match != "" {
103+
logger.Printf("getting latest release matching %s...", match)
104+
matchRegex = regexp.MustCompile("^" + match)
105+
}
106+
release, err := repo.GetLatestRelease(conf.BetaRelease.MaintainedVersion, matchRegex)
99107
exitIfError(err)
100108
logger.Println("found version: " + release.Version.String())
101109

pkg/config/config.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package config
22

33
import (
44
"encoding/json"
5-
"github.com/urfave/cli/v2"
65
"os"
6+
7+
"github.com/urfave/cli/v2"
78
)
89

910
type (
@@ -21,6 +22,7 @@ type (
2122
Prerelease bool
2223
TravisCom bool
2324
BetaRelease BetaRelease
25+
Match string
2426
}
2527

2628
BetaRelease struct {
@@ -42,6 +44,7 @@ func NewConfig(c *cli.Context) *Config {
4244
GheHost: c.String("ghe-host"),
4345
Prerelease: c.Bool("prerelease"),
4446
TravisCom: c.Bool("travis-com"),
47+
Match: c.String("match"),
4548
}
4649

4750
f, err := os.OpenFile(".semrelrc", os.O_RDONLY, 0)

pkg/config/flags.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@ var CliFlags = []cli.Flag{
5555
Name: "travis-com",
5656
Usage: "force semantic-release to use the travis-ci.com API endpoint",
5757
},
58+
&cli.StringFlag{
59+
Name: "match",
60+
Usage: "Only consider tags matching the given glob(7) pattern, excluding the \"refs/tags/\" prefix.",
61+
},
5862
}

pkg/semrel/semrel.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import (
44
"context"
55
"errors"
66
"fmt"
7-
"github.com/Masterminds/semver"
8-
"github.com/google/go-github/v30/github"
9-
"golang.org/x/oauth2"
107
"regexp"
118
"sort"
129
"strconv"
1310
"strings"
1411
"time"
12+
13+
"github.com/Masterminds/semver"
14+
"github.com/google/go-github/v30/github"
15+
"golang.org/x/oauth2"
1516
)
1617

1718
var commitPattern = regexp.MustCompile("^(\\w*)(?:\\((.*)\\))?\\: (.*)$")
@@ -122,7 +123,7 @@ func (repo *Repository) GetCommits(sha string) ([]*Commit, error) {
122123
return ret, nil
123124
}
124125

125-
func (repo *Repository) GetLatestRelease(vrange string) (*Release, error) {
126+
func (repo *Repository) GetLatestRelease(vrange string, re *regexp.Regexp) (*Release, error) {
126127
allReleases := make(Releases, 0)
127128
opts := &github.ReferenceListOptions{"tags", github.ListOptions{PerPage: 100}}
128129
for {
@@ -134,7 +135,11 @@ func (repo *Repository) GetLatestRelease(vrange string) (*Release, error) {
134135
return nil, err
135136
}
136137
for _, r := range refs {
137-
version, err := semver.NewVersion(strings.TrimPrefix(r.GetRef(), "refs/tags/"))
138+
tag := strings.TrimPrefix(r.GetRef(), "refs/tags/")
139+
if re != nil && !re.MatchString(tag) {
140+
continue
141+
}
142+
version, err := semver.NewVersion(tag)
138143
if err != nil {
139144
continue
140145
}

pkg/semrel/semrel_test.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7-
"github.com/Masterminds/semver"
8-
"github.com/google/go-github/v30/github"
97
"net/http"
108
"net/http/httptest"
119
"net/url"
10+
"regexp"
1211
"strings"
1312
"testing"
13+
14+
"github.com/Masterminds/semver"
15+
"github.com/google/go-github/v30/github"
1416
)
1517

1618
func TestNewRepository(t *testing.T) {
@@ -53,6 +55,7 @@ var (
5355
createRef("refs/tags/v2.1.0-beta", "deadbeef"),
5456
createRef("refs/tags/v3.0.0-beta.2", "deadbeef"),
5557
createRef("refs/tags/v3.0.0-beta.1", "deadbeef"),
58+
createRef("refs/tags/2020.04.19", "deadbeef"),
5659
}
5760
)
5861

@@ -155,30 +158,40 @@ func TestGetCommits(t *testing.T) {
155158
func TestGetLatestRelease(t *testing.T) {
156159
repo, ts := getNewTestRepo(t)
157160
defer ts.Close()
158-
release, err := repo.GetLatestRelease("")
161+
release, err := repo.GetLatestRelease("", nil)
162+
if err != nil {
163+
t.Fatal(err)
164+
}
165+
if release.SHA != "deadbeef" || release.Version.String() != "2020.4.19" {
166+
t.Fatal("invalid tag")
167+
}
168+
169+
re := regexp.MustCompile("^v[0-9]*")
170+
release, err = repo.GetLatestRelease("", re)
159171
if err != nil {
160172
t.Fatal(err)
161173
}
162174
if release.SHA != "deadbeef" || release.Version.String() != "2.0.0" {
163175
t.Fatal("invalid tag")
164176
}
165-
release, err = repo.GetLatestRelease("2-beta")
177+
178+
release, err = repo.GetLatestRelease("2-beta", nil)
166179
if err != nil {
167180
t.Fatal(err)
168181
}
169182
if release.SHA != "deadbeef" || release.Version.String() != "2.1.0-beta" {
170183
t.Fatal("invalid tag")
171184
}
172185

173-
release, err = repo.GetLatestRelease("3-beta")
186+
release, err = repo.GetLatestRelease("3-beta", nil)
174187
if err != nil {
175188
t.Fatal(err)
176189
}
177190
if release.SHA != "deadbeef" || release.Version.String() != "3.0.0-beta.2" {
178191
t.Fatal("invalid tag")
179192
}
180193

181-
release, err = repo.GetLatestRelease("4-beta")
194+
release, err = repo.GetLatestRelease("4-beta", nil)
182195
if err != nil {
183196
t.Fatal(err)
184197
}

0 commit comments

Comments
 (0)