From f9a95f6d020153c0a99147afdce34ab30299e27d Mon Sep 17 00:00:00 2001 From: Benjamin Elder Date: Sun, 10 Nov 2019 17:51:56 -0800 Subject: [PATCH] make spinner handle long lines --- go.mod | 1 + go.sum | 4 ++++ pkg/internal/util/cli/spinner.go | 11 +++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 9ae67fe7..18373e1f 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.13 require ( github.com/alessio/shellescape v0.0.0-20190409004728-b115ca0f9053 github.com/evanphx/json-patch v4.5.0+incompatible + github.com/mattn/go-colorable v0.1.4 github.com/mattn/go-isatty v0.0.10 github.com/pkg/errors v0.8.1 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index 3ce58e47..f6beb343 100644 --- a/go.sum +++ b/go.sum @@ -52,6 +52,9 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -98,6 +101,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd h1:3x5uuvBgE6oaXJjCOvpCC1IpgJogqQ+PqGGU3ZxAgII= diff --git a/pkg/internal/util/cli/spinner.go b/pkg/internal/util/cli/spinner.go index 0d97eff4..9c9fadac 100644 --- a/pkg/internal/util/cli/spinner.go +++ b/pkg/internal/util/cli/spinner.go @@ -19,8 +19,11 @@ package cli import ( "fmt" "io" + "os" "sync" "time" + + colorable "github.com/mattn/go-colorable" ) // custom CLI loading spinner for kind @@ -60,7 +63,11 @@ type Spinner struct { var _ io.Writer = &Spinner{} // NewSpinner initializes and returns a new Spinner that will write to w +// NOTE: w should be os.Stderr or similar, and it should be a Terminal func NewSpinner(w io.Writer) *Spinner { + if v, ok := w.(*os.File); ok { + w = colorable.NewColorable(v) + } return &Spinner{ stop: make(chan struct{}, 1), stopped: make(chan struct{}), @@ -116,7 +123,7 @@ func (s *Spinner) Start() { func() { s.mu.Lock() defer s.mu.Unlock() - fmt.Fprintf(s.writer, "\r%s%s%s", s.prefix, frame, s.suffix) + fmt.Fprintf(s.writer, "\x1b[?7l\x1b[2K\r%s%s%s\x1b[?7h", s.prefix, frame, s.suffix) }() } } @@ -149,7 +156,7 @@ func (s *Spinner) Write(p []byte) (n int, err error) { return s.writer.Write(p) } // otherwise: we will rewrite the line first - if _, err := s.writer.Write([]byte("\r")); err != nil { + if _, err := s.writer.Write([]byte("\x1b[2K\r")); err != nil { return 0, err } return s.writer.Write(p)