hub/commands/ci_status.go

133 строки
2.5 KiB
Go
Исходник Обычный вид История

2013-05-29 22:58:46 +04:00
package commands
import (
2013-05-30 06:10:18 +04:00
"fmt"
"os"
2014-02-10 20:22:36 +04:00
"github.com/github/hub/git"
"github.com/github/hub/github"
"github.com/github/hub/ui"
2014-02-10 20:22:36 +04:00
"github.com/github/hub/utils"
2013-05-29 22:58:46 +04:00
)
var cmdCiStatus = &Command{
Run: ciStatus,
Usage: "ci-status [-v] [<COMMIT>]",
Long: `Display GitHub Status information for a commit.
2013-12-08 22:37:01 +04:00
## Options:
-v
Print detailed report of all status checks and their URLs.
<COMMIT>
A commit SHA or branch name (default: "HEAD").
Exits with one of: success (0), error (1), failure (1), pending (2), no status (3).
2016-01-24 18:50:01 +03:00
## See also:
hub-pull-request(1), hub(1)
2013-05-29 22:58:46 +04:00
`,
}
2013-12-08 22:32:00 +04:00
var flagCiStatusVerbose bool
func init() {
cmdCiStatus.Flag.BoolVarP(&flagCiStatusVerbose, "verbose", "v", false, "VERBOSE")
CmdRunner.Use(cmdCiStatus)
2013-12-08 22:32:00 +04:00
}
func ciStatus(cmd *Command, args *Args) {
2013-05-30 06:10:18 +04:00
ref := "HEAD"
2013-07-02 22:56:45 +04:00
if !args.IsParamsEmpty() {
2013-07-06 00:45:22 +04:00
ref = args.RemoveParam(0)
2013-05-29 22:58:46 +04:00
}
localRepo, err := github.LocalRepo()
utils.Check(err)
project, err := localRepo.MainProject()
2013-12-08 22:32:00 +04:00
utils.Check(err)
sha, err := git.Ref(ref)
if err != nil {
err = fmt.Errorf("Aborted: no revision could be determined from '%s'", ref)
}
2013-05-29 22:58:46 +04:00
utils.Check(err)
2013-07-06 00:45:22 +04:00
if args.Noop {
ui.Printf("Would request CI status for %s\n", sha)
2013-07-06 00:45:22 +04:00
} else {
gh := github.NewClient(project.Host)
response, err := gh.FetchCIStatus(project, sha)
2013-07-06 00:45:22 +04:00
utils.Check(err)
state := response.State
if len(response.Statuses) == 0 {
state = ""
}
var exitCode int
switch state {
case "success":
exitCode = 0
case "failure", "error":
exitCode = 1
case "pending":
exitCode = 2
default:
exitCode = 3
}
if flagCiStatusVerbose && len(response.Statuses) > 0 {
verboseFormat(response.Statuses)
2013-12-08 22:32:00 +04:00
} else {
if state != "" {
ui.Println(state)
} else {
ui.Println("no status")
}
2013-07-06 00:45:22 +04:00
}
os.Exit(exitCode)
}
}
2015-09-28 14:50:47 +03:00
func verboseFormat(statuses []github.CIStatus) {
colorize := ui.IsTerminal(os.Stdout)
2013-05-30 06:10:18 +04:00
contextWidth := 0
for _, status := range statuses {
if len(status.Context) > contextWidth {
contextWidth = len(status.Context)
}
2013-05-30 06:10:18 +04:00
}
for _, status := range statuses {
var color int
var stateMarker string
switch status.State {
case "success":
stateMarker = "✔︎"
color = 32
case "failure", "error":
stateMarker = "✖︎"
color = 31
case "pending":
stateMarker = "●"
color = 33
}
2013-05-30 06:10:18 +04:00
if colorize {
stateMarker = fmt.Sprintf("\033[%dm%s\033[0m", color, stateMarker)
}
if status.TargetUrl == "" {
ui.Printf("%s\t%s\n", stateMarker, status.Context)
} else {
ui.Printf("%s\t%-*s\t%s\n", stateMarker, contextWidth, status.Context, status.TargetUrl)
}
}
2013-05-29 22:58:46 +04:00
}