add initial out command
This commit is contained in:
41
cmd/out/out.go
Normal file
41
cmd/out/out.go
Normal 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
89
fakes/fake_git_hub.go
Normal 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
17
fmt.go
Normal 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
62
github.go
Normal 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
45
out_command.go
Normal 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
35
resources.go
Normal 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"`
|
||||||
|
}
|
Reference in New Issue
Block a user