diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-04-06 07:01:32 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-04-06 07:01:32 -0700 |
| commit | 045737f983446d8a28b493518dd39b8c6ac02c33 (patch) | |
| tree | b06897cbe14899814c2952e37ce11f6ff991ba1c | |
| parent | 1d0f034c46d5bf73629b6480f8dbf4ec24e16375 (diff) | |
| download | progress-bar-045737f983446d8a28b493518dd39b8c6ac02c33.tar.zst | |
Use a 2 minute rolling average
| -rw-r--r-- | go.mod | 4 | ||||
| -rw-r--r-- | go.sum | 8 | ||||
| -rw-r--r-- | progress.go | 29 |
3 files changed, 21 insertions, 20 deletions
@@ -3,8 +3,8 @@ module gitlab.com/rhogenson/progress-bar go 1.24.1 require ( - gitlab.com/rhogenson/vecdeque v0.0.0-20250405212855-dfc639535656 - golang.org/x/term v0.30.0 + gitlab.com/rhogenson/vecdeque v0.0.0-20250406001322-9e21d75e8d13 + golang.org/x/term v0.31.0 ) require golang.org/x/sys v0.32.0 // indirect @@ -1,6 +1,6 @@ -gitlab.com/rhogenson/vecdeque v0.0.0-20250405212855-dfc639535656 h1:doc1SOczGwCrlM79hCNRuIY5P72zj+iCSYqAQ4v4+Pg= -gitlab.com/rhogenson/vecdeque v0.0.0-20250405212855-dfc639535656/go.mod h1:i++skCmDHJAQbyC5LqvJbehbEGCiO8EkrsPon6h0Jgo= +gitlab.com/rhogenson/vecdeque v0.0.0-20250406001322-9e21d75e8d13 h1:KzxZ53VHLj1w4DsYcbdIjNFPTcnc4UtBA79KoXkdgP0= +gitlab.com/rhogenson/vecdeque v0.0.0-20250406001322-9e21d75e8d13/go.mod h1:i++skCmDHJAQbyC5LqvJbehbEGCiO8EkrsPon6h0Jgo= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= 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...") |
