add initial out command

This commit is contained in:
Chris Brown
2015-01-31 23:04:49 +00:00
parent 6780afd2ca
commit a36b7368e7
6 changed files with 289 additions and 0 deletions

41
cmd/out/out.go Normal file
View File

@@ -0,0 +1,41 @@
package main
import (
"encoding/json"
"os"
"github.com/concourse/github-release-resource"
)
func main() {
if len(os.Args) < 2 {
resource.Sayf("usage: %s <sources directory>\n", os.Args[0])
os.Exit(1)
}
var request resource.OutRequest
inputRequest(&request)
sourceDir := os.Args[1]
github := resource.NewGitHubClient(request.Source)
command := resource.NewOutCommand(github)
response, err := command.Run(sourceDir, request)
if err != nil {
resource.Fatal("running command", err)
}
outputResponse(response)
}
func inputRequest(request *resource.OutRequest) {
if err := json.NewDecoder(os.Stdin).Decode(request); err != nil {
resource.Fatal("reading request from stdin", err)
}
}
func outputResponse(response resource.OutResponse) {
if err := json.NewEncoder(os.Stdout).Encode(response); err != nil {
resource.Fatal("writing response to stdout", err)
}
}

89
fakes/fake_git_hub.go Normal file
View File

@@ -0,0 +1,89 @@
// This file was generated by counterfeiter
package fakes
import (
"os"
"sync"
"github.com/concourse/github-release-resource"
"github.com/google/go-github/github"
)
type FakeGitHub struct {
CreateReleaseStub func(release github.RepositoryRelease) (github.RepositoryRelease, error)
createReleaseMutex sync.RWMutex
createReleaseArgsForCall []struct {
release github.RepositoryRelease
}
createReleaseReturns struct {
result1 github.RepositoryRelease
result2 error
}
UploadReleaseAssetStub func(release github.RepositoryRelease, name string, file *os.File)
uploadReleaseAssetMutex sync.RWMutex
uploadReleaseAssetArgsForCall []struct {
release github.RepositoryRelease
name string
file *os.File
}
}
func (fake *FakeGitHub) CreateRelease(release github.RepositoryRelease) (github.RepositoryRelease, error) {
fake.createReleaseMutex.Lock()
fake.createReleaseArgsForCall = append(fake.createReleaseArgsForCall, struct {
release github.RepositoryRelease
}{release})
fake.createReleaseMutex.Unlock()
if fake.CreateReleaseStub != nil {
return fake.CreateReleaseStub(release)
} else {
return fake.createReleaseReturns.result1, fake.createReleaseReturns.result2
}
}
func (fake *FakeGitHub) CreateReleaseCallCount() int {
fake.createReleaseMutex.RLock()
defer fake.createReleaseMutex.RUnlock()
return len(fake.createReleaseArgsForCall)
}
func (fake *FakeGitHub) CreateReleaseArgsForCall(i int) github.RepositoryRelease {
fake.createReleaseMutex.RLock()
defer fake.createReleaseMutex.RUnlock()
return fake.createReleaseArgsForCall[i].release
}
func (fake *FakeGitHub) CreateReleaseReturns(result1 github.RepositoryRelease, result2 error) {
fake.CreateReleaseStub = nil
fake.createReleaseReturns = struct {
result1 github.RepositoryRelease
result2 error
}{result1, result2}
}
func (fake *FakeGitHub) UploadReleaseAsset(release github.RepositoryRelease, name string, file *os.File) {
fake.uploadReleaseAssetMutex.Lock()
fake.uploadReleaseAssetArgsForCall = append(fake.uploadReleaseAssetArgsForCall, struct {
release github.RepositoryRelease
name string
file *os.File
}{release, name, file})
fake.uploadReleaseAssetMutex.Unlock()
if fake.UploadReleaseAssetStub != nil {
fake.UploadReleaseAssetStub(release, name, file)
}
}
func (fake *FakeGitHub) UploadReleaseAssetCallCount() int {
fake.uploadReleaseAssetMutex.RLock()
defer fake.uploadReleaseAssetMutex.RUnlock()
return len(fake.uploadReleaseAssetArgsForCall)
}
func (fake *FakeGitHub) UploadReleaseAssetArgsForCall(i int) (github.RepositoryRelease, string, *os.File) {
fake.uploadReleaseAssetMutex.RLock()
defer fake.uploadReleaseAssetMutex.RUnlock()
return fake.uploadReleaseAssetArgsForCall[i].release, fake.uploadReleaseAssetArgsForCall[i].name, fake.uploadReleaseAssetArgsForCall[i].file
}
var _ resource.GitHub = new(FakeGitHub)

17
fmt.go Normal file
View File

@@ -0,0 +1,17 @@
package resource
import (
"fmt"
"os"
"github.com/mitchellh/colorstring"
)
func Fatal(doing string, err error) {
Sayf(colorstring.Color("[red]error %s: %s\n"), doing, err)
os.Exit(1)
}
func Sayf(message string, args ...interface{}) {
fmt.Fprintf(os.Stderr, message, args...)
}

62
github.go Normal file
View File

@@ -0,0 +1,62 @@
package resource
import (
"os"
"code.google.com/p/goauth2/oauth"
"github.com/google/go-github/github"
)
//go:generate counterfeiter . GitHub
type GitHub interface {
CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error)
UploadReleaseAsset(release *github.RepositoryRelease, name string, file *os.File) error
}
type GitHubClient struct {
client *github.Client
user string
repository string
}
func NewGitHubClient(source OutSource) *GitHubClient {
transport := &oauth.Transport{
Token: &oauth.Token{
AccessToken: source.AccessToken,
},
}
client := github.NewClient(transport.Client())
return &GitHubClient{
client: client,
user: source.User,
repository: source.Repository,
}
}
func (g *GitHubClient) CreateRelease(release *github.RepositoryRelease) (*github.RepositoryRelease, error) {
createdRelease, _, err := g.client.Repositories.CreateRelease(g.user, g.repository, release)
if err != nil {
return &github.RepositoryRelease{}, err
}
return createdRelease, nil
}
func (g *GitHubClient) UploadReleaseAsset(release *github.RepositoryRelease, name string, file *os.File) error {
_, _, err := g.client.Repositories.UploadReleaseAsset(
g.user,
g.repository,
*release.ID,
&github.UploadOptions{
Name: name,
},
file,
)
return err
}

45
out_command.go Normal file
View File

@@ -0,0 +1,45 @@
package resource
import (
"os"
"path/filepath"
"github.com/google/go-github/github"
)
type OutCommand struct {
github GitHub
}
func NewOutCommand(github GitHub) *OutCommand {
return &OutCommand{
github: github,
}
}
func (c *OutCommand) Run(sourceDir string, request OutRequest) (OutResponse, error) {
params := request.Params
release := &github.RepositoryRelease{}
createdRelease, err := c.github.CreateRelease(release)
if err != nil {
return OutResponse{}, err
}
for _, filePath := range params.Globs {
file, err := os.Open(filePath)
if err != nil {
return OutResponse{}, err
}
name := filepath.Base(filePath)
err = c.github.UploadReleaseAsset(createdRelease, name, file)
if err != nil {
return OutResponse{}, err
}
file.Close()
}
return OutResponse{}, nil
}

35
resources.go Normal file
View File

@@ -0,0 +1,35 @@
package resource
type OutRequest struct {
Source OutSource `json:"source"`
Params OutParams `json:"params"`
}
type OutSource struct {
AccessToken string `json:"access_token"`
User string `json:"user"`
Repository string `json:"repository"`
}
type OutParams struct {
NamePath string `json:"name"`
BodyPath string `json:"body"`
TagPath string `json:"tag"`
Globs []string `json:"globs"`
}
type OutResponse struct {
Version Version `json:"version"`
Metadata []MetadataPair `json:"metadata"`
}
type Version struct {
Tag string `json:"tag"`
}
type MetadataPair struct {
Name string `json:"name"`
Value string `json:"value"`
}