diff --git a/cmd/status.go b/cmd/status.go index a0dba99..1868641 100644 --- a/cmd/status.go +++ b/cmd/status.go @@ -3,8 +3,12 @@ package cmd import ( "fmt" "log" + "os" + "os/signal" "time" + "syscall" + "github.com/cheggaaa/pb" "github.com/fatih/color" "github.com/molotovtv/tc/internal/config" @@ -40,6 +44,9 @@ var statusCmd = &cobra.Command{ func buildStatus(c config.Config, buildID string) { bar := pb.StartNew(100) var build *tc.Build + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) + buildInterrupted := false for { var err error build, err = tc.LastBuild(c, buildID) @@ -52,9 +59,26 @@ func buildStatus(c config.Config, buildID string) { } bar.Set(int(build.PercentageComplete)) - time.Sleep(time.Second) + select { + case <-signalChan: + buildInterrupted = true + break + case <-time.After(time.Second): + break + } + if buildInterrupted { + break + } } + signal.Reset(os.Interrupt, syscall.SIGTERM) bar.Finish() + if buildInterrupted { + if err := tc.CancelBuild(c, build.ID); err != nil { + log.Fatal(err) + } + color.Magenta("Build cancelled!") + return + } if build == nil || build.Status != "SUCCESS" { color.Red("Build failed!") return diff --git a/tc/project.go b/tc/project.go index 3c02405..a088448 100644 --- a/tc/project.go +++ b/tc/project.go @@ -5,6 +5,7 @@ import ( "fmt" "io/ioutil" "net/http" + "strings" "github.com/molotovtv/tc/internal/config" ) @@ -37,6 +38,35 @@ const ( BuildStatusFinished BuildState = "finished" ) +// CancelBuild ... +func CancelBuild(config config.Config, build int) error { + req, err := http.NewRequest( + http.MethodPost, + fmt.Sprintf("%s/app/rest/builds/id:%d", config.URL, build), + strings.NewReader(""), + ) + if err != nil { + return err + } + + req.Header.Add("Content-Type", "application/xml") + req.Header.Add("Accept", "application/json") + req.SetBasicAuth(config.UserName, config.Password) + + client := &http.Client{} + res, err := client.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + if res.StatusCode != 200 { + body, _ := ioutil.ReadAll(res.Body) + return fmt.Errorf("error making request: %s", string(body)) + } + return nil +} + // LastBuild ... func LastBuild(config config.Config, build string) (*Build, error) { req, err := http.NewRequest(