summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--go.mod4
-rw-r--r--go.sum8
-rw-r--r--progress.go29
3 files changed, 21 insertions, 20 deletions
diff --git a/go.mod b/go.mod
index 03223e0..24fe437 100644
--- a/go.mod
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
index aaaaccc..c219b71 100644
--- a/go.sum
+++ b/go.sum
@@ -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...")