adding stubs for command line API
This commit is contained in:
parent
25a6eb79ae
commit
fe5cbb4160
9 changed files with 319 additions and 0 deletions
23
client/command/build.go
Normal file
23
client/command/build.go
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewBuildCommand returns the CLI command for "build".
|
||||||
|
func NewBuildCommand() cli.Command {
|
||||||
|
return cli.Command{
|
||||||
|
Name: "build",
|
||||||
|
Usage: "run a local build",
|
||||||
|
Flags: []cli.Flag{},
|
||||||
|
Action: func(c *cli.Context) {
|
||||||
|
buildCommandFunc(c)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// buildCommandFunc executes the "build" command.
|
||||||
|
func buildCommandFunc(c *cli.Context) error {
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
104
client/command/client.go
Normal file
104
client/command/client.go
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrNotFound = errors.New("Not Found")
|
||||||
|
ErrForbidden = errors.New("Forbidden")
|
||||||
|
ErrBadRequest = errors.New("Bad Request")
|
||||||
|
ErrNotAuthorized = errors.New("Unauthorized")
|
||||||
|
ErrInternalServer = errors.New("Internal Server Error")
|
||||||
|
)
|
||||||
|
|
||||||
|
type Client struct {
|
||||||
|
Token string
|
||||||
|
URL string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do submits an http.Request and parses the JSON-encoded http.Response,
|
||||||
|
// storing the result in the value pointed to by v.
|
||||||
|
func (c *Client) Do(method, path string, in, out interface{}) error {
|
||||||
|
|
||||||
|
// create the URI
|
||||||
|
uri, err := url.Parse(c.URL + path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(uri.Scheme) == 0 {
|
||||||
|
uri.Scheme = "http"
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(c.Token) > 0 {
|
||||||
|
params := uri.Query()
|
||||||
|
params.Add("access_token", c.Token)
|
||||||
|
uri.RawQuery = params.Encode()
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the request
|
||||||
|
req := &http.Request{
|
||||||
|
URL: uri,
|
||||||
|
Method: method,
|
||||||
|
ProtoMajor: 1,
|
||||||
|
ProtoMinor: 1,
|
||||||
|
Close: true,
|
||||||
|
ContentLength: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
// if data input is provided, serialize to JSON
|
||||||
|
if in != nil {
|
||||||
|
inJson, err := json.Marshal(in)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := bytes.NewBuffer(inJson)
|
||||||
|
req.Body = ioutil.NopCloser(buf)
|
||||||
|
|
||||||
|
req.ContentLength = int64(len(inJson))
|
||||||
|
req.Header.Set("Content-Length", strconv.Itoa(len(inJson)))
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
}
|
||||||
|
|
||||||
|
// make the request using the default http client
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the bytes from the body (make sure we defer close the body)
|
||||||
|
defer resp.Body.Close()
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for an http error status (ie not 200 StatusOK)
|
||||||
|
switch resp.StatusCode {
|
||||||
|
case 404:
|
||||||
|
return ErrNotFound
|
||||||
|
case 403:
|
||||||
|
return ErrForbidden
|
||||||
|
case 401:
|
||||||
|
return ErrNotAuthorized
|
||||||
|
case 400:
|
||||||
|
return ErrBadRequest
|
||||||
|
case 500:
|
||||||
|
return ErrInternalServer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unmarshall the JSON response
|
||||||
|
if out != nil {
|
||||||
|
return json.Unmarshal(body, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
BIN
client/command/command
Executable file
BIN
client/command/command
Executable file
Binary file not shown.
34
client/command/disable.go
Normal file
34
client/command/disable.go
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewDisableCommand returns the CLI command for "disable".
|
||||||
|
func NewDisableCommand() cli.Command {
|
||||||
|
return cli.Command{
|
||||||
|
Name: "disable",
|
||||||
|
Usage: "disable a repository",
|
||||||
|
Flags: []cli.Flag{},
|
||||||
|
Action: func(c *cli.Context) {
|
||||||
|
handle(c, disableCommandFunc)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// disableCommandFunc executes the "disable" command.
|
||||||
|
func disableCommandFunc(c *cli.Context, client *Client) error {
|
||||||
|
var repo string
|
||||||
|
var arg = c.Args()
|
||||||
|
|
||||||
|
if len(arg) != 0 {
|
||||||
|
repo = arg[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
err := client.Do("DELETE", "/v1/repos/"+repo, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
34
client/command/enable.go
Normal file
34
client/command/enable.go
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewEnableCommand returns the CLI command for "enable".
|
||||||
|
func NewEnableCommand() cli.Command {
|
||||||
|
return cli.Command{
|
||||||
|
Name: "enable",
|
||||||
|
Usage: "enable a repository",
|
||||||
|
Flags: []cli.Flag{},
|
||||||
|
Action: func(c *cli.Context) {
|
||||||
|
handle(c, enableCommandFunc)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// enableCommandFunc executes the "enable" command.
|
||||||
|
func enableCommandFunc(c *cli.Context, client *Client) error {
|
||||||
|
var repo string
|
||||||
|
var arg = c.Args()
|
||||||
|
|
||||||
|
if len(arg) != 0 {
|
||||||
|
repo = arg[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
err := client.Do("POST", "/v1/repos/"+repo, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
29
client/command/handle.go
Normal file
29
client/command/handle.go
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
type handlerFunc func(*cli.Context, *Client) error
|
||||||
|
|
||||||
|
// handle wraps the command function handlers and
|
||||||
|
// sets up the environment.
|
||||||
|
func handle(c *cli.Context, fn handlerFunc) {
|
||||||
|
client := Client{}
|
||||||
|
client.Token = os.Getenv("DRONE_TOKEN")
|
||||||
|
client.URL = os.Getenv("DRONE_HOST")
|
||||||
|
|
||||||
|
// if no url is provided we can default
|
||||||
|
// to the hosted Drone service.
|
||||||
|
if len(client.URL) == 0 {
|
||||||
|
client.URL = "http://test.drone.io"
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the function
|
||||||
|
if err := fn(c, &client); err != nil {
|
||||||
|
println(err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
23
client/command/main.go
Normal file
23
client/command/main.go
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := cli.NewApp()
|
||||||
|
app.Name = "drone"
|
||||||
|
app.Version = "1.0"
|
||||||
|
app.Usage = "command line utility"
|
||||||
|
app.EnableBashCompletion = true
|
||||||
|
|
||||||
|
app.Commands = []cli.Command{
|
||||||
|
NewEnableCommand(),
|
||||||
|
NewDisableCommand(),
|
||||||
|
NewRestartCommand(),
|
||||||
|
NewWhoamiCommand(),
|
||||||
|
}
|
||||||
|
|
||||||
|
app.Run(os.Args)
|
||||||
|
}
|
40
client/command/restart.go
Normal file
40
client/command/restart.go
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewRestartCommand returns the CLI command for "restart".
|
||||||
|
func NewRestartCommand() cli.Command {
|
||||||
|
return cli.Command{
|
||||||
|
Name: "restart",
|
||||||
|
Usage: "restarts a build",
|
||||||
|
Flags: []cli.Flag{},
|
||||||
|
Action: func(c *cli.Context) {
|
||||||
|
handle(c, restartCommandFunc)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// restartCommandFunc executes the "restart" command.
|
||||||
|
func restartCommandFunc(c *cli.Context, client *Client) error {
|
||||||
|
var branch string = "master"
|
||||||
|
var commit string
|
||||||
|
var repo string
|
||||||
|
var arg = c.Args()
|
||||||
|
|
||||||
|
switch len(arg) {
|
||||||
|
case 2:
|
||||||
|
repo = arg[0]
|
||||||
|
commit = arg[1]
|
||||||
|
case 3:
|
||||||
|
repo = arg[0]
|
||||||
|
branch = arg[1]
|
||||||
|
commit = arg[2]
|
||||||
|
}
|
||||||
|
|
||||||
|
path := fmt.Sprintf("/v1/repos/%s/branches/%s/commits/%s?action=rebuild", repo, branch, commit)
|
||||||
|
return client.Do("POST", path, nil, nil)
|
||||||
|
}
|
32
client/command/whoami.go
Normal file
32
client/command/whoami.go
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
"github.com/drone/drone/shared/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewWhoamiCommand returns the CLI command for "whoami".
|
||||||
|
func NewWhoamiCommand() cli.Command {
|
||||||
|
return cli.Command{
|
||||||
|
Name: "whoami",
|
||||||
|
Usage: "outputs the current user",
|
||||||
|
Flags: []cli.Flag{},
|
||||||
|
Action: func(c *cli.Context) {
|
||||||
|
handle(c, whoamiCommandFunc)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// whoamiCommandFunc executes the "logout" command.
|
||||||
|
func whoamiCommandFunc(c *cli.Context, client *Client) error {
|
||||||
|
user := model.User{}
|
||||||
|
err := client.Do("GET", "/v1/user", nil, &user)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(user.Login)
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in a new issue