filter by drafts in the check step

The user now opts-in to getting final or draft releases. Default
behaviour is final releases.

NOTE: There is also strict filtering on only allowing semver supported tags.

Signed-off-by: David Jahn <david.a.jahn@gmail.com>
This commit is contained in:
JT Archie
2015-10-22 12:27:52 -04:00
committed by David Jahn
parent e3a3a53dba
commit 7331e0a7ad
13 changed files with 329 additions and 54 deletions

View File

@@ -19,6 +19,10 @@ Fetches and creates versioned GitHub resources.
* `github_api_url`: *Optional.* If you use a non-public GitHub deployment then * `github_api_url`: *Optional.* If you use a non-public GitHub deployment then
you can set your API URL here. you can set your API URL here.
* `drafts`: *Optional.* When set to `true` only returns draft releases with
semver compliant tags. Defaults to `false` returning only final releases
with semver compliant tags.
### Example ### Example
``` yaml ``` yaml
@@ -93,3 +97,5 @@ matching the patterns in `globs` to the release.
* `globs`: *Optional.* A list of globs for files that will be uploaded alongside * `globs`: *Optional.* A list of globs for files that will be uploaded alongside
the created release. the created release.
* `draft`: *Optional.* A boolean to set the release in draft mode or not.

View File

@@ -2,6 +2,7 @@ package resource
import ( import (
"sort" "sort"
"strconv"
"github.com/blang/semver" "github.com/blang/semver"
"github.com/zachgersh/go-github/github" "github.com/zachgersh/go-github/github"
@@ -27,40 +28,55 @@ func (c *CheckCommand) Run(request CheckRequest) ([]Version, error) {
return []Version{}, nil return []Version{}, nil
} }
sort.Sort(byVersion(releases))
var filteredReleases []github.RepositoryRelease var filteredReleases []github.RepositoryRelease
for _, release := range releases { for _, release := range releases {
draft := *release.Draft if request.Source.Drafts != *release.Draft {
if !draft { continue
}
if release.TagName == nil {
continue
}
if _, err := semver.New(determineVersionFromTag(*release.TagName)); err != nil {
continue
}
filteredReleases = append(filteredReleases, release) filteredReleases = append(filteredReleases, release)
} }
sort.Sort(byVersion(filteredReleases))
if len(filteredReleases) == 0 {
return []Version{}, nil
} }
latestRelease := filteredReleases[len(filteredReleases)-1]
latestVersion := *filteredReleases[len(filteredReleases)-1].TagName if (request.Version == Version{}) {
if request.Version.Tag == "" {
return []Version{ return []Version{
{Tag: latestVersion}, versionFromDraft(&latestRelease),
}, nil }, nil
} }
if latestVersion == request.Version.Tag { if *latestRelease.TagName == request.Version.Tag {
return []Version{}, nil return []Version{}, nil
} }
upToLatest := false upToLatest := false
reversedVersions := []Version{} reversedVersions := []Version{}
for _, release := range filteredReleases { for _, release := range filteredReleases {
version := *release.TagName
if upToLatest { if upToLatest {
reversedVersions = append(reversedVersions, Version{Tag: version}) reversedVersions = append(reversedVersions, versionFromDraft(&release))
} else { } else {
if *release.Draft {
id := *release.ID
upToLatest = request.Version.ID == strconv.Itoa(id)
} else {
version := *release.TagName
upToLatest = request.Version.Tag == version upToLatest = request.Version.Tag == version
} }
} }
}
return reversedVersions, nil return reversedVersions, nil
} }
@@ -76,10 +92,6 @@ func (r byVersion) Swap(i, j int) {
} }
func (r byVersion) Less(i, j int) bool { func (r byVersion) Less(i, j int) bool {
if r[i].TagName == nil || r[j].TagName == nil {
return false
}
first, err := semver.New(determineVersionFromTag(*r[i].TagName)) first, err := semver.New(determineVersionFromTag(*r[i].TagName))
if err != nil { if err != nil {
return true return true

View File

@@ -42,12 +42,26 @@ var _ = Describe("Check Command", func() {
}) })
}) })
Context("when there are releases that get filtered out", func() {
BeforeEach(func() {
returnedReleases = []github.RepositoryRelease{
newDraftRepositoryRelease(1, "v0.1.4"),
}
})
It("returns no versions", func() {
versions, err := command.Run(resource.CheckRequest{})
Ω(err).ShouldNot(HaveOccurred())
Ω(versions).Should(BeEmpty())
})
})
Context("when there are releases", func() { Context("when there are releases", func() {
BeforeEach(func() { BeforeEach(func() {
returnedReleases = []github.RepositoryRelease{ returnedReleases = []github.RepositoryRelease{
newRepositoryRelease("v0.4.0"), newRepositoryRelease(1, "v0.4.0"),
newRepositoryRelease("0.1.3"), newRepositoryRelease(2, "0.1.3"),
newRepositoryRelease("v0.1.2"), newRepositoryRelease(3, "v0.1.2"),
} }
}) })
@@ -82,10 +96,10 @@ var _ = Describe("Check Command", func() {
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{
newRepositoryRelease("v0.1.4"), newRepositoryRelease(1, "v0.1.4"),
newRepositoryRelease("0.4.0"), newRepositoryRelease(2, "0.4.0"),
newRepositoryRelease("v0.1.3"), newRepositoryRelease(3, "v0.1.3"),
newRepositoryRelease("0.1.2"), newRepositoryRelease(4, "0.1.2"),
} }
}) })
@@ -122,9 +136,9 @@ var _ = Describe("Check Command", func() {
Context("and one of the releases is a draft", func() { Context("and one of the releases is a draft", func() {
BeforeEach(func() { BeforeEach(func() {
returnedReleases = []github.RepositoryRelease{ returnedReleases = []github.RepositoryRelease{
newDraftRepositoryRelease("v0.1.4"), newDraftRepositoryRelease(1, "v0.1.4"),
newRepositoryRelease("0.4.0"), newRepositoryRelease(2, "0.4.0"),
newRepositoryRelease("v0.1.3"), newRepositoryRelease(3, "v0.1.3"),
} }
}) })
@@ -143,6 +157,78 @@ var _ = Describe("Check Command", func() {
})) }))
}) })
}) })
Context("when draft releases are allowed", func() {
Context("and one of the releases is a final release", func() {
BeforeEach(func() {
returnedReleases = []github.RepositoryRelease{
newDraftRepositoryRelease(1, "v0.1.4"),
newDraftRepositoryRelease(3, "v0.1.1"),
newRepositoryRelease(2, "0.4.0"),
}
})
It("returns all of the versions that are newer, and only draft", func() {
command := resource.NewCheckCommand(githubClient)
response, err := command.Run(resource.CheckRequest{
Version: resource.Version{ID: "3"},
Source: resource.Source{Drafts: true},
})
Ω(err).ShouldNot(HaveOccurred())
Ω(response).Should(Equal([]resource.Version{
{ID: "1"},
}))
})
})
Context("and non-of them are semver", func() {
BeforeEach(func() {
returnedReleases = []github.RepositoryRelease{
newDraftRepositoryRelease(1, "abc"),
newDraftRepositoryRelease(2, "123"),
}
})
It("returns all of the releases with semver resources", func() {
command := resource.NewCheckCommand(githubClient)
response, err := command.Run(resource.CheckRequest{
Version: resource.Version{},
Source: resource.Source{Drafts: true},
})
Ω(err).ShouldNot(HaveOccurred())
Ω(response).Should(Equal([]resource.Version{}))
})
})
Context("and one of the releases is not a versioned draft release", func() {
BeforeEach(func() {
returnedReleases = []github.RepositoryRelease{
newDraftRepositoryRelease(1, "v0.1.4"),
newDraftRepositoryRelease(2, ""),
newDraftWithNilTagRepositoryRelease(3),
newDraftRepositoryRelease(4, "asdf123"),
}
})
It("returns all of the releases with semver resources", func() {
command := resource.NewCheckCommand(githubClient)
response, err := command.Run(resource.CheckRequest{
Version: resource.Version{},
Source: resource.Source{Drafts: true},
})
Ω(err).ShouldNot(HaveOccurred())
Ω(response).Should(Equal([]resource.Version{
{ID: "1"},
}))
})
})
})
}) })
}) })
}) })

View File

@@ -28,6 +28,15 @@ type FakeGitHub struct {
result1 *github.RepositoryRelease result1 *github.RepositoryRelease
result2 error result2 error
} }
GetReleaseStub func(id int) (*github.RepositoryRelease, error)
getReleaseMutex sync.RWMutex
getReleaseArgsForCall []struct {
id int
}
getReleaseReturns struct {
result1 *github.RepositoryRelease
result2 error
}
CreateReleaseStub func(release github.RepositoryRelease) (*github.RepositoryRelease, error) CreateReleaseStub func(release github.RepositoryRelease) (*github.RepositoryRelease, error)
createReleaseMutex sync.RWMutex createReleaseMutex sync.RWMutex
createReleaseArgsForCall []struct { createReleaseArgsForCall []struct {
@@ -160,6 +169,39 @@ func (fake *FakeGitHub) GetReleaseByTagReturns(result1 *github.RepositoryRelease
}{result1, result2} }{result1, result2}
} }
func (fake *FakeGitHub) GetRelease(id int) (*github.RepositoryRelease, error) {
fake.getReleaseMutex.Lock()
fake.getReleaseArgsForCall = append(fake.getReleaseArgsForCall, struct {
id int
}{id})
fake.getReleaseMutex.Unlock()
if fake.GetReleaseStub != nil {
return fake.GetReleaseStub(id)
} else {
return fake.getReleaseReturns.result1, fake.getReleaseReturns.result2
}
}
func (fake *FakeGitHub) GetReleaseCallCount() int {
fake.getReleaseMutex.RLock()
defer fake.getReleaseMutex.RUnlock()
return len(fake.getReleaseArgsForCall)
}
func (fake *FakeGitHub) GetReleaseArgsForCall(i int) int {
fake.getReleaseMutex.RLock()
defer fake.getReleaseMutex.RUnlock()
return fake.getReleaseArgsForCall[i].id
}
func (fake *FakeGitHub) GetReleaseReturns(result1 *github.RepositoryRelease, result2 error) {
fake.GetReleaseStub = nil
fake.getReleaseReturns = struct {
result1 *github.RepositoryRelease
result2 error
}{result1, result2}
}
func (fake *FakeGitHub) CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) { func (fake *FakeGitHub) CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) {
fake.createReleaseMutex.Lock() fake.createReleaseMutex.Lock()
fake.createReleaseArgsForCall = append(fake.createReleaseArgsForCall, struct { fake.createReleaseArgsForCall = append(fake.createReleaseArgsForCall, struct {
@@ -364,7 +406,7 @@ func (fake *FakeGitHub) GetTarballLink(tag string) (*url.URL, error) {
tag string tag string
}{tag}) }{tag})
fake.getTarballLinkMutex.Unlock() fake.getTarballLinkMutex.Unlock()
if fake.GetReleaseByTagStub != nil { if fake.GetTarballLinkStub != nil {
return fake.GetTarballLinkStub(tag) return fake.GetTarballLinkStub(tag)
} else { } else {
return fake.getTarballLinkReturns.result1, fake.getTarballLinkReturns.result2 return fake.getTarballLinkReturns.result1, fake.getTarballLinkReturns.result2
@@ -397,7 +439,7 @@ func (fake *FakeGitHub) GetZipballLink(tag string) (*url.URL, error) {
tag string tag string
}{tag}) }{tag})
fake.getZipballLinkMutex.Unlock() fake.getZipballLinkMutex.Unlock()
if fake.GetReleaseByTagStub != nil { if fake.GetZipballLinkStub != nil {
return fake.GetZipballLinkStub(tag) return fake.GetZipballLinkStub(tag)
} else { } else {
return fake.getZipballLinkReturns.result1, fake.getZipballLinkReturns.result2 return fake.getZipballLinkReturns.result1, fake.getZipballLinkReturns.result2

View File

@@ -16,6 +16,7 @@ import (
type GitHub interface { type GitHub interface {
ListReleases() ([]github.RepositoryRelease, error) ListReleases() ([]github.RepositoryRelease, error)
GetReleaseByTag(tag string) (*github.RepositoryRelease, error) GetReleaseByTag(tag string) (*github.RepositoryRelease, error)
GetRelease(id int) (*github.RepositoryRelease, error)
CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error)
UpdateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) UpdateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error)
@@ -93,6 +94,20 @@ func (g *GitHubClient) GetReleaseByTag(tag string) (*github.RepositoryRelease, e
return release, nil return release, nil
} }
func (g *GitHubClient) GetRelease(id int) (*github.RepositoryRelease, error) {
release, res, err := g.client.Repositories.GetRelease(g.user, g.repository, id)
if err != nil {
return &github.RepositoryRelease{}, nil
}
err = res.Body.Close()
if err != nil {
return nil, err
}
return release, nil
}
func (g *GitHubClient) CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) { func (g *GitHubClient) CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error) {
createdRelease, res, err := g.client.Repositories.CreateRelease(g.user, g.repository, &release) createdRelease, res, err := g.client.Repositories.CreateRelease(g.user, g.repository, &release)
if err != nil { if err != nil {

View File

@@ -8,6 +8,7 @@ import (
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
"strconv"
"github.com/zachgersh/go-github/github" "github.com/zachgersh/go-github/github"
) )
@@ -32,7 +33,12 @@ func (c *InCommand) Run(destDir string, request InRequest) (InResponse, error) {
var foundRelease *github.RepositoryRelease var foundRelease *github.RepositoryRelease
if request.Version.Tag != "" {
foundRelease, err = c.github.GetReleaseByTag(request.Version.Tag) foundRelease, err = c.github.GetReleaseByTag(request.Version.Tag)
} else {
id, _ := strconv.Atoi(request.Version.ID)
foundRelease, err = c.github.GetRelease(id)
}
if err != nil { if err != nil {
return InResponse{}, err return InResponse{}, err
} }
@@ -41,7 +47,7 @@ func (c *InCommand) Run(destDir string, request InRequest) (InResponse, error) {
return InResponse{}, errors.New("no releases") return InResponse{}, errors.New("no releases")
} }
if *foundRelease.TagName != "" { if foundRelease.TagName != nil && *foundRelease.TagName != "" {
tagPath := filepath.Join(destDir, "tag") tagPath := filepath.Join(destDir, "tag")
err = ioutil.WriteFile(tagPath, []byte(*foundRelease.TagName), 0644) err = ioutil.WriteFile(tagPath, []byte(*foundRelease.TagName), 0644)
if err != nil { if err != nil {
@@ -116,9 +122,7 @@ func (c *InCommand) Run(destDir string, request InRequest) (InResponse, error) {
} }
return InResponse{ return InResponse{
Version: Version{ Version: versionFromDraft(foundRelease),
Tag: *foundRelease.TagName,
},
Metadata: metadataFromRelease(foundRelease), Metadata: metadataFromRelease(foundRelease),
}, nil }, nil
} }

View File

@@ -67,6 +67,16 @@ var _ = Describe("In Command", func() {
} }
} }
buildNilTagRelease := func(id int) *github.RepositoryRelease {
return &github.RepositoryRelease{
ID: github.Int(id),
HTMLURL: github.String("http://google.com"),
Name: github.String("release-name"),
Body: github.String("*markdown*"),
Draft: github.Bool(true),
}
}
buildAsset := func(id int, name string) github.ReleaseAsset { buildAsset := func(id int, name string) github.ReleaseAsset {
return github.ReleaseAsset{ return github.ReleaseAsset{
ID: github.Int(id), ID: github.Int(id),
@@ -116,9 +126,16 @@ var _ = Describe("In Command", func() {
resource.MetadataPair{Name: "url", Value: "http://google.com"}, resource.MetadataPair{Name: "url", Value: "http://google.com"},
resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"}, resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"},
resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true}, resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true},
resource.MetadataPair{Name: "tag", Value: "v0.35.0"},
)) ))
}) })
It("calls #GetReleastByTag with the correct arguments", func() {
command.Run(destDir, inRequest)
Ω(githubClient.GetReleaseByTagArgsForCall(0)).Should(Equal("v0.35.0"))
})
It("downloads only the files that match the globs", func() { It("downloads only the files that match the globs", func() {
inResponse, inErr = command.Run(destDir, inRequest) inResponse, inErr = command.Run(destDir, inRequest)
@@ -319,6 +336,7 @@ var _ = Describe("In Command", func() {
resource.MetadataPair{Name: "url", Value: "http://google.com"}, resource.MetadataPair{Name: "url", Value: "http://google.com"},
resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"}, resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"},
resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true}, resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true},
resource.MetadataPair{Name: "tag", Value: "v0.35.0"},
)) ))
}) })
@@ -391,9 +409,9 @@ var _ = Describe("In Command", func() {
Context("when there is a draft release", func() { Context("when there is a draft release", func() {
Context("which has a tag", func() { Context("which has a tag", func() {
BeforeEach(func() { BeforeEach(func() {
githubClient.GetReleaseByTagReturns(buildRelease(1, "v0.35.0", true), nil) githubClient.GetReleaseReturns(buildRelease(1, "v0.35.0", true), nil)
inRequest.Version = &resource.Version{Tag: "v0.35.0"} inRequest.Version = &resource.Version{ID: "1"}
inResponse, inErr = command.Run(destDir, inRequest) inResponse, inErr = command.Run(destDir, inRequest)
}) })
@@ -402,7 +420,7 @@ var _ = Describe("In Command", func() {
}) })
It("returns the fetched version", func() { It("returns the fetched version", func() {
Ω(inResponse.Version).Should(Equal(resource.Version{Tag: "v0.35.0"})) Ω(inResponse.Version).Should(Equal(resource.Version{ID: "1"}))
}) })
It("has some sweet metadata", func() { It("has some sweet metadata", func() {
@@ -410,6 +428,8 @@ var _ = Describe("In Command", func() {
resource.MetadataPair{Name: "url", Value: "http://google.com"}, resource.MetadataPair{Name: "url", Value: "http://google.com"},
resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"}, resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"},
resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true}, resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true},
resource.MetadataPair{Name: "tag", Value: "v0.35.0"},
resource.MetadataPair{Name: "draft", Value: "true"},
)) ))
}) })
@@ -424,11 +444,11 @@ var _ = Describe("In Command", func() {
}) })
}) })
Context("which doesn't have a tag", func() { Context("which has an empty tag", func() {
BeforeEach(func() { BeforeEach(func() {
githubClient.GetReleaseByTagReturns(buildRelease(1, "", true), nil) githubClient.GetReleaseReturns(buildRelease(1, "", true), nil)
inRequest.Version = &resource.Version{} inRequest.Version = &resource.Version{ID: "1"}
inResponse, inErr = command.Run(destDir, inRequest) inResponse, inErr = command.Run(destDir, inRequest)
}) })
@@ -437,7 +457,7 @@ var _ = Describe("In Command", func() {
}) })
It("returns the fetched version", func() { It("returns the fetched version", func() {
Ω(inResponse.Version).Should(Equal(resource.Version{Tag: ""})) Ω(inResponse.Version).Should(Equal(resource.Version{ID: "1"}))
}) })
It("has some sweet metadata", func() { It("has some sweet metadata", func() {
@@ -445,6 +465,39 @@ var _ = Describe("In Command", func() {
resource.MetadataPair{Name: "url", Value: "http://google.com"}, resource.MetadataPair{Name: "url", Value: "http://google.com"},
resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"}, resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"},
resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true}, resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true},
resource.MetadataPair{Name: "tag", Value: ""},
resource.MetadataPair{Name: "draft", Value: "true"},
))
})
It("does not create the tag and version files", func() {
Ω(path.Join(destDir, "tag")).ShouldNot(BeAnExistingFile())
Ω(path.Join(destDir, "version")).ShouldNot(BeAnExistingFile())
})
})
Context("which has a nil tag", func() {
BeforeEach(func() {
githubClient.GetReleaseReturns(buildNilTagRelease(1), nil)
inRequest.Version = &resource.Version{ID: "1"}
inResponse, inErr = command.Run(destDir, inRequest)
})
It("succeeds", func() {
Ω(inErr).ShouldNot(HaveOccurred())
})
It("returns the fetched version", func() {
Ω(inResponse.Version).Should(Equal(resource.Version{ID: "1"}))
})
It("has some sweet metadata", func() {
Ω(inResponse.Metadata).Should(ConsistOf(
resource.MetadataPair{Name: "url", Value: "http://google.com"},
resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"},
resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true},
resource.MetadataPair{Name: "draft", Value: "true"},
)) ))
}) })

View File

@@ -33,5 +33,19 @@ func metadataFromRelease(release *github.RepositoryRelease) []MetadataPair {
}) })
} }
if release.TagName != nil {
metadata = append(metadata, MetadataPair{
Name: "tag",
Value: *release.TagName,
})
}
if *release.Draft {
metadata = append(metadata, MetadataPair{
Name: "draft",
Value: "true",
})
}
return metadata return metadata
} }

View File

@@ -69,7 +69,7 @@ func (c *OutCommand) Run(sourceDir string, request OutRequest) (OutResponse, err
var existingRelease *github.RepositoryRelease var existingRelease *github.RepositoryRelease
for _, e := range existingReleases { for _, e := range existingReleases {
if *e.TagName == tag { if e.TagName != nil && *e.TagName == tag {
existingRelease = &e existingRelease = &e
break break
} }
@@ -130,9 +130,7 @@ func (c *OutCommand) Run(sourceDir string, request OutRequest) (OutResponse, err
} }
return OutResponse{ return OutResponse{
Version: Version{ Version: versionFromDraft(release),
Tag: tag,
},
Metadata: metadataFromRelease(release), Metadata: metadataFromRelease(release),
}, nil }, nil
} }

View File

@@ -76,10 +76,15 @@ var _ = Describe("Out Command", func() {
BeforeEach(func() { BeforeEach(func() {
githubClient.ListReleasesReturns([]github.RepositoryRelease{ githubClient.ListReleasesReturns([]github.RepositoryRelease{
{
ID: github.Int(1),
Draft: github.Bool(true),
},
{ {
ID: github.Int(112), ID: github.Int(112),
TagName: github.String("some-tag-name"), TagName: github.String("some-tag-name"),
Assets: existingAssets, Assets: existingAssets,
Draft: github.Bool(false),
}, },
}, nil) }, nil)
@@ -228,6 +233,19 @@ var _ = Describe("Out Command", func() {
Ω(*release.Body).Should(Equal("")) Ω(*release.Body).Should(Equal(""))
Ω(*release.Draft).Should(Equal(true)) Ω(*release.Draft).Should(Equal(true))
}) })
It("has some sweet metadata", func() {
outResponse, err := command.Run(sourcesDir, request)
Ω(err).ShouldNot(HaveOccurred())
Ω(outResponse.Metadata).Should(ConsistOf(
resource.MetadataPair{Name: "url", Value: "http://google.com"},
resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"},
resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true},
resource.MetadataPair{Name: "tag", Value: "0.3.12"},
resource.MetadataPair{Name: "draft", Value: "true"},
))
})
}) })
Context("with file globs", func() { Context("with file globs", func() {
@@ -272,6 +290,7 @@ var _ = Describe("Out Command", func() {
resource.MetadataPair{Name: "url", Value: "http://google.com"}, resource.MetadataPair{Name: "url", Value: "http://google.com"},
resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"}, resource.MetadataPair{Name: "name", Value: "release-name", URL: "http://google.com"},
resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true}, resource.MetadataPair{Name: "body", Value: "*markdown*", Markdown: true},
resource.MetadataPair{Name: "tag", Value: "0.3.12"},
)) ))
}) })

View File

@@ -13,18 +13,25 @@ func TestGithubReleaseResource(t *testing.T) {
RunSpecs(t, "Github Release Resource Suite") RunSpecs(t, "Github Release Resource Suite")
} }
func newRepositoryRelease(version string) github.RepositoryRelease { func newRepositoryRelease(id int, version string) github.RepositoryRelease {
draft := false
return github.RepositoryRelease{ return github.RepositoryRelease{
TagName: github.String(version), TagName: github.String(version),
Draft: &draft, Draft: github.Bool(false),
ID: github.Int(id),
} }
} }
func newDraftRepositoryRelease(version string) github.RepositoryRelease { func newDraftRepositoryRelease(id int, version string) github.RepositoryRelease {
draft := true
return github.RepositoryRelease{ return github.RepositoryRelease{
TagName: github.String(version), TagName: github.String(version),
Draft: &draft, Draft: github.Bool(true),
ID: github.Int(id),
}
}
func newDraftWithNilTagRepositoryRelease(id int) github.RepositoryRelease {
return github.RepositoryRelease{
Draft: github.Bool(true),
ID: github.Int(id),
} }
} }

View File

@@ -6,6 +6,7 @@ type Source struct {
GitHubAPIURL string `json:"github_api_url"` GitHubAPIURL string `json:"github_api_url"`
AccessToken string `json:"access_token"` AccessToken string `json:"access_token"`
Drafts bool `json:"drafts"`
} }
type CheckRequest struct { type CheckRequest struct {
@@ -51,7 +52,8 @@ type OutResponse struct {
} }
type Version struct { type Version struct {
Tag string `json:"tag"` Tag string `json:"tag,omitempty"`
ID string `json:"id,omitempty"`
} }
type MetadataPair struct { type MetadataPair struct {

View File

@@ -1,10 +1,27 @@
package resource package resource
import "regexp" import (
"regexp"
"strconv"
"github.com/zachgersh/go-github/github"
)
// determineVersionFromTag converts git tags v1.2.3 into semver 1.2.3 values // determineVersionFromTag converts git tags v1.2.3 into semver 1.2.3 values
func determineVersionFromTag(tag string) string { func determineVersionFromTag(tag string) string {
re := regexp.MustCompile("v?([^v].*)") re := regexp.MustCompile("v?([^v].*)")
matches := re.FindStringSubmatch(tag) matches := re.FindStringSubmatch(tag)
if len(matches) > 0 {
return matches[1] return matches[1]
} else {
return ""
}
}
func versionFromDraft(release *github.RepositoryRelease) Version {
if *release.Draft {
return Version{ID: strconv.Itoa(*release.ID)}
} else {
return Version{Tag: *release.TagName}
}
} }