diff options
Diffstat (limited to 'progress.go')
| -rw-r--r-- | progress.go | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/progress.go b/progress.go index 11821c1..2d78cef 100644 --- a/progress.go +++ b/progress.go @@ -28,8 +28,6 @@ import ( "golang.org/x/term" ) -const measurements = 20 - type measurement struct { t time.Time i int @@ -40,19 +38,15 @@ type Bar struct { max int measurements vecdeque.DQ[measurement] cols int + secondPrint bool } func New(max int) *Bar { - b := &Bar{max: max} - b.measurements.Grow(measurements) - return b + return &Bar{max: max} } // Set sets the current value to val. func (b *Bar) Set(val int) { - if b.measurements.Len() == measurements { - b.measurements.PopFront() - } b.measurements.PushBack(measurement{time.Now(), val}) } @@ -62,6 +56,10 @@ func (b *Bar) Print() { return } + now := time.Now() + for b.measurements.Len() > 1 && now.Sub(b.measurements.Get(0).t) > 2*time.Minute { + b.measurements.PopFront() + } first := b.measurements.Get(0) last := b.measurements.Get(b.measurements.Len() - 1) deltaT := last.t.Sub(first.t) @@ -71,16 +69,19 @@ func (b *Bar) Print() { eta = time.Duration(float64(b.max-last.i) / float64(delta) * float64(deltaT)) } - p := last.i * b.cols / b.max + if b.secondPrint { + fmt.Fprint(os.Stderr, "\033[2F\033[J") + } + b.secondPrint = true if b.cols == 0 { var err error if b.cols, _, err = term.GetSize(int(os.Stderr.Fd())); err != nil { - fmt.Fprintf(os.Stderr, "Warning: unable to determine terminal size: %s\n", err) - } else { - fmt.Fprintf(os.Stderr, "%s>\n", strings.Repeat("=", max(p-1, 0))) + fmt.Fprintf(os.Stderr, "Unable to determine terminal size: %s\n", err) } - } else { - fmt.Fprintf(os.Stderr, "\033[2F\033[J%s>\n", strings.Repeat("=", max(p-1, 0))) + } + p := last.i * b.cols / b.max + if b.cols > 0 { + fmt.Fprintf(os.Stderr, "%s>\n", strings.Repeat("=", max(p-1, 0))) } if eta < 0 { fmt.Fprintln(os.Stderr, "ETA: calculating...") |
