Add tag filter regex.

This commit is contained in:
Joshua Carp
2018-03-03 21:31:29 -05:00
parent 351c6d03fd
commit b708a1ce3a
6 changed files with 105 additions and 35 deletions

View File

@@ -31,6 +31,11 @@ func (c *CheckCommand) Run(request CheckRequest) ([]Version, error) {
var filteredReleases []*github.RepositoryRelease var filteredReleases []*github.RepositoryRelease
versionParser, err := newVersionParser(request.Source.TagFilter)
if err != nil {
return []Version{}, err
}
for _, release := range releases { for _, release := range releases {
if request.Source.Drafts != *release.Draft { if request.Source.Drafts != *release.Draft {
continue continue
@@ -46,14 +51,26 @@ func (c *CheckCommand) Run(request CheckRequest) ([]Version, error) {
if release.TagName == nil { if release.TagName == nil {
continue continue
} }
if _, err := version.NewVersionFromString(determineVersionFromTag(*release.TagName)); err != nil { if _, err := version.NewVersionFromString(versionParser.parse(*release.TagName)); err != nil {
continue continue
} }
filteredReleases = append(filteredReleases, release) filteredReleases = append(filteredReleases, release)
} }
sort.Sort(byVersion(filteredReleases)) sort.Slice(filteredReleases, func(i, j int) bool {
first, err := version.NewVersionFromString(versionParser.parse(*filteredReleases[i].TagName))
if err != nil {
return true
}
second, err := version.NewVersionFromString(versionParser.parse(*filteredReleases[j].TagName))
if err != nil {
return false
}
return first.IsLt(second)
})
if len(filteredReleases) == 0 { if len(filteredReleases) == 0 {
return []Version{}, nil return []Version{}, nil
@@ -99,27 +116,3 @@ func (c *CheckCommand) Run(request CheckRequest) ([]Version, error) {
return reversedVersions, nil return reversedVersions, nil
} }
type byVersion []*github.RepositoryRelease
func (r byVersion) Len() int {
return len(r)
}
func (r byVersion) Swap(i, j int) {
r[i], r[j] = r[j], r[i]
}
func (r byVersion) Less(i, j int) bool {
first, err := version.NewVersionFromString(determineVersionFromTag(*r[i].TagName))
if err != nil {
return true
}
second, err := version.NewVersionFromString(determineVersionFromTag(*r[j].TagName))
if err != nil {
return false
}
return first.IsLt(second)
}

View File

@@ -93,6 +93,34 @@ var _ = Describe("Check Command", func() {
}) })
Context("when there are releases", func() { Context("when there are releases", func() {
Context("and there is a custom tag filter", func() {
BeforeEach(func() {
returnedReleases = []*github.RepositoryRelease{
newRepositoryRelease(1, "package-0.1.4"),
newRepositoryRelease(2, "package-0.4.0"),
newRepositoryRelease(3, "package-0.1.3"),
newRepositoryRelease(4, "package-0.1.2"),
}
})
It("returns all of the versions that are newer", func() {
command := resource.NewCheckCommand(githubClient)
response, err := command.Run(resource.CheckRequest{
Version: resource.Version{
Tag: "package-0.1.3",
},
})
Ω(err).ShouldNot(HaveOccurred())
Ω(response).Should(Equal([]resource.Version{
{Tag: "package-0.1.3"},
{Tag: "package-0.1.4"},
{Tag: "package-0.4.0"},
}))
})
})
Context("and the releases do not contain a draft release", func() { Context("and the releases do not contain a draft release", func() {
BeforeEach(func() { BeforeEach(func() {
returnedReleases = []*github.RepositoryRelease{ returnedReleases = []*github.RepositoryRelease{

View File

@@ -55,7 +55,11 @@ func (c *InCommand) Run(destDir string, request InRequest) (InResponse, error) {
return InResponse{}, err return InResponse{}, err
} }
version := determineVersionFromTag(*foundRelease.TagName) versionParser, err := newVersionParser(request.Source.TagFilter)
if err != nil {
return InResponse{}, err
}
version := versionParser.parse(*foundRelease.TagName)
versionPath := filepath.Join(destDir, "version") versionPath := filepath.Join(destDir, "version")
err = ioutil.WriteFile(versionPath, []byte(version), 0644) err = ioutil.WriteFile(versionPath, []byte(version), 0644)
if err != nil { if err != nil {

View File

@@ -180,6 +180,35 @@ var _ = Describe("In Command", func() {
Ω(string(contents)).Should(Equal("*markdown*")) Ω(string(contents)).Should(Equal("*markdown*"))
}) })
Context("when there is a custom tag filter", func() {
BeforeEach(func() {
inRequest.Source = resource.Source{
TagFilter: "package-(.*)",
}
githubClient.GetReleaseByTagReturns(buildRelease(1, "package-0.35.0", false), nil)
githubClient.GetRefReturns(buildTagRef("package-0.35.0", "f28085a4a8f744da83411f5e09fd7b1709149eee"), nil)
inResponse, inErr = command.Run(destDir, inRequest)
})
It("succeeds", func() {
inResponse, inErr = command.Run(destDir, inRequest)
Expect(inErr).ToNot(HaveOccurred())
})
It("does create the body, tag and version files", func() {
inResponse, inErr = command.Run(destDir, inRequest)
contents, err := ioutil.ReadFile(path.Join(destDir, "tag"))
Ω(err).ShouldNot(HaveOccurred())
Ω(string(contents)).Should(Equal("package-0.35.0"))
contents, err = ioutil.ReadFile(path.Join(destDir, "version"))
Ω(err).ShouldNot(HaveOccurred())
Ω(string(contents)).Should(Equal("0.35.0"))
})
})
Context("when include_source_tarball is true", func() { Context("when include_source_tarball is true", func() {
var tarballUrl *url.URL var tarballUrl *url.URL

View File

@@ -14,6 +14,8 @@ type Source struct {
PreRelease bool `json:"pre_release"` PreRelease bool `json:"pre_release"`
Release bool `json:"release"` Release bool `json:"release"`
Insecure bool `json:"insecure"` Insecure bool `json:"insecure"`
TagFilter string `json:"tag_filter"`
} }
type CheckRequest struct { type CheckRequest struct {

View File

@@ -7,15 +7,29 @@ import (
"github.com/google/go-github/github" "github.com/google/go-github/github"
) )
// determineVersionFromTag converts git tags v1.2.3 into semver 1.2.3 values var defaultTagFilter = "v?([^v].*)"
func determineVersionFromTag(tag string) string {
re := regexp.MustCompile("v?([^v].*)") type versionParser struct {
matches := re.FindStringSubmatch(tag) re *regexp.Regexp
if len(matches) > 0 { }
return matches[1]
} else { func newVersionParser(filter string) (versionParser, error) {
return "" if filter == "" {
filter = defaultTagFilter
} }
re, err := regexp.Compile(filter)
if err != nil {
return versionParser{}, err
}
return versionParser{re: re}, nil
}
func (vp *versionParser) parse(tag string) string {
matches := vp.re.FindStringSubmatch(tag)
if len(matches) > 0 {
return matches[len(matches)-1]
}
return ""
} }
func versionFromRelease(release *github.RepositoryRelease) Version { func versionFromRelease(release *github.RepositoryRelease) Version {