summaryrefslogtreecommitdiffstats
path: root/progress.go
diff options
context:
space:
mode:
Diffstat (limited to 'progress.go')
-rw-r--r--progress.go29
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...")