implement check command
This commit is contained in:
62
check_command.go
Normal file
62
check_command.go
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
package resource
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/google/go-github/github"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CheckCommand struct {
|
||||||
|
github GitHub
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCheckCommand(github GitHub) *CheckCommand {
|
||||||
|
return &CheckCommand{
|
||||||
|
github: github,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CheckCommand) Run(request CheckRequest) ([]Version, error) {
|
||||||
|
releases, err := c.github.ListReleases()
|
||||||
|
if err != nil {
|
||||||
|
return []Version{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
return []Version{}, errors.New("repository had no releases")
|
||||||
|
}
|
||||||
|
|
||||||
|
latestVersion := *releases[0].TagName
|
||||||
|
|
||||||
|
if request.Version.Tag == "" {
|
||||||
|
return []Version{
|
||||||
|
{Tag: latestVersion},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if latestVersion == request.Version.Tag {
|
||||||
|
return []Version{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
upToLatest := false
|
||||||
|
reversedVersions := []Version{}
|
||||||
|
for _, release := range reverse(releases) {
|
||||||
|
version := *release.TagName
|
||||||
|
|
||||||
|
if upToLatest {
|
||||||
|
reversedVersions = append(reversedVersions, Version{Tag: version})
|
||||||
|
} else {
|
||||||
|
upToLatest = request.Version.Tag == version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return reversedVersions, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func reverse(s []github.RepositoryRelease) []github.RepositoryRelease {
|
||||||
|
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
s[i], s[j] = s[j], s[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
120
check_command_test.go
Normal file
120
check_command_test.go
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
package resource_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
|
"github.com/google/go-github/github"
|
||||||
|
|
||||||
|
"github.com/concourse/github-release-resource"
|
||||||
|
"github.com/concourse/github-release-resource/fakes"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("Check Command", func() {
|
||||||
|
var (
|
||||||
|
githubClient *fakes.FakeGitHub
|
||||||
|
command *resource.CheckCommand
|
||||||
|
|
||||||
|
returnedReleases []github.RepositoryRelease
|
||||||
|
)
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
githubClient = &fakes.FakeGitHub{}
|
||||||
|
command = resource.NewCheckCommand(githubClient)
|
||||||
|
|
||||||
|
returnedReleases = []github.RepositoryRelease{}
|
||||||
|
})
|
||||||
|
|
||||||
|
JustBeforeEach(func() {
|
||||||
|
githubClient.ListReleasesReturns(returnedReleases, nil)
|
||||||
|
})
|
||||||
|
|
||||||
|
Context("when this is the first time that the resource has been run", func() {
|
||||||
|
Context("when there are no releases", func() {
|
||||||
|
BeforeEach(func() {
|
||||||
|
returnedReleases = []github.RepositoryRelease{}
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns an error when there are no releases", func() {
|
||||||
|
_, err := command.Run(resource.CheckRequest{})
|
||||||
|
Ω(err).Should(HaveOccurred())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Context("when there are releases", func() {
|
||||||
|
BeforeEach(func() {
|
||||||
|
returnedReleases = []github.RepositoryRelease{
|
||||||
|
{TagName: github.String("0.4.0")},
|
||||||
|
{TagName: github.String("0.1.3")},
|
||||||
|
{TagName: github.String("0.1.2")},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
It("outputs the most recent version only", func() {
|
||||||
|
command := resource.NewCheckCommand(githubClient)
|
||||||
|
|
||||||
|
response, err := command.Run(resource.CheckRequest{})
|
||||||
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
|
|
||||||
|
Ω(response).Should(HaveLen(1))
|
||||||
|
Ω(response[0]).Should(Equal(resource.Version{
|
||||||
|
Tag: "0.4.0",
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Context("when there are prior versions", func() {
|
||||||
|
Context("when there are no releases", func() {
|
||||||
|
BeforeEach(func() {
|
||||||
|
returnedReleases = []github.RepositoryRelease{}
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns an error when there are no releases", func() {
|
||||||
|
_, err := command.Run(resource.CheckRequest{})
|
||||||
|
Ω(err).Should(HaveOccurred())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Context("when there are releases", func() {
|
||||||
|
BeforeEach(func() {
|
||||||
|
returnedReleases = []github.RepositoryRelease{
|
||||||
|
{TagName: github.String("0.4.0")},
|
||||||
|
{TagName: github.String("0.1.4")},
|
||||||
|
{TagName: github.String("0.1.3")},
|
||||||
|
{TagName: github.String("0.1.2")},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
It("returns an empty list if the lastet version has been checked", func() {
|
||||||
|
command := resource.NewCheckCommand(githubClient)
|
||||||
|
|
||||||
|
response, err := command.Run(resource.CheckRequest{
|
||||||
|
Version: resource.Version{
|
||||||
|
Tag: "0.4.0",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
|
|
||||||
|
Ω(response).Should(BeEmpty())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("all of the versions that are newer", func() {
|
||||||
|
command := resource.NewCheckCommand(githubClient)
|
||||||
|
|
||||||
|
response, err := command.Run(resource.CheckRequest{
|
||||||
|
Version: resource.Version{
|
||||||
|
Tag: "0.1.3",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
|
|
||||||
|
Ω(response).Should(HaveLen(2))
|
||||||
|
Ω(response).Should(Equal([]resource.Version{
|
||||||
|
{Tag: "0.1.4"},
|
||||||
|
{Tag: "0.4.0"},
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
@@ -1,7 +1,34 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/concourse/github-release-resource"
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
fmt.Println("[]")
|
var request resource.CheckRequest
|
||||||
|
inputRequest(&request)
|
||||||
|
|
||||||
|
github := resource.NewGitHubClient(request.Source)
|
||||||
|
command := resource.NewCheckCommand(github)
|
||||||
|
response, err := command.Run(request)
|
||||||
|
if err != nil {
|
||||||
|
resource.Fatal("running command", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
outputResponse(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
func inputRequest(request *resource.CheckRequest) {
|
||||||
|
if err := json.NewDecoder(os.Stdin).Decode(request); err != nil {
|
||||||
|
resource.Fatal("reading request from stdin", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func outputResponse(response []resource.Version) {
|
||||||
|
if err := json.NewEncoder(os.Stdout).Encode(response); err != nil {
|
||||||
|
resource.Fatal("writing response to stdout", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,27 +0,0 @@
|
|||||||
package main_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
|
||||||
. "github.com/onsi/gomega"
|
|
||||||
|
|
||||||
"github.com/onsi/gomega/gexec"
|
|
||||||
)
|
|
||||||
|
|
||||||
var checkPath string
|
|
||||||
|
|
||||||
func TestCheck(t *testing.T) {
|
|
||||||
RegisterFailHandler(Fail)
|
|
||||||
RunSpecs(t, "Check Suite")
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = BeforeSuite(func() {
|
|
||||||
var err error
|
|
||||||
checkPath, err = gexec.Build("github.com/concourse/github-release-resource/cmd/check")
|
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
var _ = AfterSuite(func() {
|
|
||||||
gexec.CleanupBuildArtifacts()
|
|
||||||
})
|
|
@@ -1,23 +0,0 @@
|
|||||||
package main_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os/exec"
|
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
|
||||||
. "github.com/onsi/gomega"
|
|
||||||
|
|
||||||
"github.com/onsi/gomega/gbytes"
|
|
||||||
"github.com/onsi/gomega/gexec"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ = Describe("Check", func() {
|
|
||||||
It("outputs an empty JSON array", func() {
|
|
||||||
command := exec.Command(checkPath)
|
|
||||||
|
|
||||||
check, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
|
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
|
||||||
|
|
||||||
Eventually(check).Should(gbytes.Say(`\[\]`))
|
|
||||||
Eventually(check).Should(gexec.Exit(0))
|
|
||||||
})
|
|
||||||
})
|
|
@@ -10,6 +10,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type FakeGitHub struct {
|
type FakeGitHub struct {
|
||||||
|
ListReleasesStub func() ([]github.RepositoryRelease, error)
|
||||||
|
listReleasesMutex sync.RWMutex
|
||||||
|
listReleasesArgsForCall []struct{}
|
||||||
|
listReleasesReturns 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 {
|
||||||
@@ -31,6 +38,31 @@ type FakeGitHub struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fake *FakeGitHub) ListReleases() ([]github.RepositoryRelease, error) {
|
||||||
|
fake.listReleasesMutex.Lock()
|
||||||
|
fake.listReleasesArgsForCall = append(fake.listReleasesArgsForCall, struct{}{})
|
||||||
|
fake.listReleasesMutex.Unlock()
|
||||||
|
if fake.ListReleasesStub != nil {
|
||||||
|
return fake.ListReleasesStub()
|
||||||
|
} else {
|
||||||
|
return fake.listReleasesReturns.result1, fake.listReleasesReturns.result2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *FakeGitHub) ListReleasesCallCount() int {
|
||||||
|
fake.listReleasesMutex.RLock()
|
||||||
|
defer fake.listReleasesMutex.RUnlock()
|
||||||
|
return len(fake.listReleasesArgsForCall)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *FakeGitHub) ListReleasesReturns(result1 []github.RepositoryRelease, result2 error) {
|
||||||
|
fake.ListReleasesStub = nil
|
||||||
|
fake.listReleasesReturns = 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 {
|
||||||
|
12
github.go
12
github.go
@@ -11,6 +11,7 @@ import (
|
|||||||
//go:generate counterfeiter . GitHub
|
//go:generate counterfeiter . GitHub
|
||||||
|
|
||||||
type GitHub interface {
|
type GitHub interface {
|
||||||
|
ListReleases() ([]github.RepositoryRelease, error)
|
||||||
CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error)
|
CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error)
|
||||||
UploadReleaseAsset(release *github.RepositoryRelease, name string, file *os.File) error
|
UploadReleaseAsset(release *github.RepositoryRelease, name string, file *os.File) error
|
||||||
}
|
}
|
||||||
@@ -22,7 +23,7 @@ type GitHubClient struct {
|
|||||||
repository string
|
repository string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGitHubClient(source OutSource) *GitHubClient {
|
func NewGitHubClient(source Source) *GitHubClient {
|
||||||
transport := &oauth.Transport{
|
transport := &oauth.Transport{
|
||||||
Token: &oauth.Token{
|
Token: &oauth.Token{
|
||||||
AccessToken: source.AccessToken,
|
AccessToken: source.AccessToken,
|
||||||
@@ -38,6 +39,15 @@ func NewGitHubClient(source OutSource) *GitHubClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GitHubClient) ListReleases() ([]github.RepositoryRelease, error) {
|
||||||
|
releases, _, err := g.client.Repositories.ListReleases(g.user, g.repository, nil)
|
||||||
|
if err != nil {
|
||||||
|
return []github.RepositoryRelease{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return releases, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (g *GitHubClient) CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error) {
|
func (g *GitHubClient) CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error) {
|
||||||
createdRelease, _, err := g.client.Repositories.CreateRelease(g.user, g.repository, release)
|
createdRelease, _, err := g.client.Repositories.CreateRelease(g.user, g.repository, release)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
17
resources.go
17
resources.go
@@ -1,17 +1,22 @@
|
|||||||
package resource
|
package resource
|
||||||
|
|
||||||
type OutRequest struct {
|
type Source struct {
|
||||||
Source OutSource `json:"source"`
|
|
||||||
Params OutParams `json:"params"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type OutSource struct {
|
|
||||||
AccessToken string `json:"access_token"`
|
AccessToken string `json:"access_token"`
|
||||||
|
|
||||||
User string `json:"user"`
|
User string `json:"user"`
|
||||||
Repository string `json:"repository"`
|
Repository string `json:"repository"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CheckRequest struct {
|
||||||
|
Source Source `json:"source"`
|
||||||
|
Version Version `json:"version"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type OutRequest struct {
|
||||||
|
Source Source `json:"source"`
|
||||||
|
Params OutParams `json:"params"`
|
||||||
|
}
|
||||||
|
|
||||||
type OutParams struct {
|
type OutParams struct {
|
||||||
NamePath string `json:"name"`
|
NamePath string `json:"name"`
|
||||||
BodyPath string `json:"body"`
|
BodyPath string `json:"body"`
|
||||||
|
Reference in New Issue
Block a user