diff --git a/go.mod b/go.mod index 33d8b1bccdbca..f015a91e5ee1f 100644 --- a/go.mod +++ b/go.mod @@ -135,7 +135,7 @@ require ( github.com/tidwall/gjson v1.19.0 github.com/tkuchiki/go-timezone v0.2.3 github.com/travelaudience/go-promhttp v1.0.1 - github.com/vbauerster/mpb/v4 v4.12.2 + github.com/vbauerster/mpb/v8 v8.12.0 go.uber.org/atomic v1.11.0 go.uber.org/goleak v1.3.0 go.uber.org/mock v0.6.0 @@ -234,7 +234,7 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/clipperhouse/displaywidth v0.10.0 // indirect - github.com/clipperhouse/uax29/v2 v2.6.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/cloudflare/circl v1.6.3 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/cockroachdb/crlib v0.0.0-20250617202621-0794c595bbe6 // indirect @@ -355,7 +355,7 @@ require ( github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.20 // indirect github.com/mdlayher/socket v0.6.0 // indirect github.com/mholt/archiver/v3 v3.5.1 // indirect github.com/microcosm-cc/bluemonday v1.0.23 // indirect diff --git a/go.sum b/go.sum index 6b3ecf545abfe..0adc0c604884d 100644 --- a/go.sum +++ b/go.sum @@ -176,7 +176,6 @@ github.com/RoaringBitmap/roaring/v2 v2.24.0 h1:zQkkBZtG3WRP4j+P3A5DO221SvL1Br88T github.com/RoaringBitmap/roaring/v2 v2.24.0/go.mod h1:SfT3of9nYh3vis1dIbCj4Yw6KQGujTN+f345nrN/0JA= github.com/Shopify/toxiproxy/v2 v2.12.0 h1:d1x++lYZg/zijXPPcv7PH0MvHMzEI5aX/YuUi/Sw+yg= github.com/Shopify/toxiproxy/v2 v2.12.0/go.mod h1:R9Z38Pw6k2cGZWXHe7tbxjGW9azmY1KbDQJ1kd+h7Tk= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= @@ -306,8 +305,8 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/clipperhouse/displaywidth v0.10.0 h1:GhBG8WuerxjFQQYeuZAeVTuyxuX+UraiZGD4HJQ3Y8g= github.com/clipperhouse/displaywidth v0.10.0/go.mod h1:XqJajYsaiEwkxOj4bowCTMcT1SgvHo9flfF3jQasdbs= -github.com/clipperhouse/uax29/v2 v2.6.0 h1:z0cDbUV+aPASdFb2/ndFnS9ts/WNXgTNNGFoKXuhpos= -github.com/clipperhouse/uax29/v2 v2.6.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudflare/cfssl v1.6.5 h1:46zpNkm6dlNkMZH/wMW22ejih6gIaJbzL2du6vD7ZeI= github.com/cloudflare/cfssl v1.6.5/go.mod h1:Bk1si7sq8h2+yVEDrFJiz3d7Aw+pfjjJSZVaD+Taky4= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= @@ -971,8 +970,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= -github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-runewidth v0.0.20 h1:WcT52H91ZUAwy8+HUkdM3THM6gXqXuLJi9O3rjcQQaQ= +github.com/mattn/go-runewidth v0.0.20/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= @@ -1395,8 +1394,8 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/vbauerster/mpb/v4 v4.12.2 h1:TsBs1nWRYF0m8cUH13pxNhOUqY6yKcOr2PeSYxp2L3I= -github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE= +github.com/vbauerster/mpb/v8 v8.12.0 h1:+gneY3ifzc88tKDzOtfG8k8gfngCx615S2ZmFM4liWg= +github.com/vbauerster/mpb/v8 v8.12.0/go.mod h1:V02YIuMVo301Y1VE9VtZlD8s84OMsk+EKN6mwvf/588= github.com/vladimirvivien/gexe v0.5.0 h1:AWBVaYnrTsGYBktXvcO0DfWPeSiZxn6mnQ5nvL+A1/A= github.com/vladimirvivien/gexe v0.5.0/go.mod h1:3gjgTqE2c0VyHnU5UOIwk7gyNzZDGulPb/DJPgcw64E= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= @@ -1538,7 +1537,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -1712,7 +1710,6 @@ golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/roxctl/central/db/restore/statusline.go b/roxctl/central/db/restore/statusline.go index d28a57f0cb0fe..45f837c09805a 100644 --- a/roxctl/central/db/restore/statusline.go +++ b/roxctl/central/db/restore/statusline.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/stackrox/rox/pkg/sync" - "github.com/vbauerster/mpb/v4/decor" + "github.com/vbauerster/mpb/v8/decor" ) // statusLine is an mpb.Filler implementation that can be used to display a status, along with an optional spinner. @@ -71,6 +71,7 @@ func (l *statusLine) currentLine(width int) string { return line } -func (l *statusLine) Fill(w io.Writer, width int, _ *decor.Statistics) { - _, _ = fmt.Fprint(w, l.currentLine(width)) +func (l *statusLine) Fill(w io.Writer, st decor.Statistics) error { + _, err := fmt.Fprint(w, l.currentLine(st.AvailableWidth)) + return err } diff --git a/roxctl/central/db/restore/v2_restorer.go b/roxctl/central/db/restore/v2_restorer.go index 40de8ccad5129..8f7756d3feac5 100644 --- a/roxctl/central/db/restore/v2_restorer.go +++ b/roxctl/central/db/restore/v2_restorer.go @@ -27,8 +27,8 @@ import ( "github.com/stackrox/rox/pkg/v2backuprestore" "github.com/stackrox/rox/roxctl/common" "github.com/stackrox/rox/roxctl/common/environment" - "github.com/vbauerster/mpb/v4" - "github.com/vbauerster/mpb/v4/decor" + "github.com/vbauerster/mpb/v8" + "github.com/vbauerster/mpb/v8/decor" "golang.org/x/term" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -180,8 +180,12 @@ func (r *v2Restorer) Run(ctx context.Context, file *os.File) (*http.Response, er ), ) - progressBarContainer.Add(0, &r.errorLine) - progressBarContainer.Add(0, &r.statusLine) + if _, err := progressBarContainer.Add(0, &r.errorLine); err != nil { + return nil, errors.Wrap(err, "adding error line to progress bar") + } + if _, err := progressBarContainer.Add(0, &r.statusLine); err != nil { + return nil, errors.Wrap(err, "adding status line to progress bar") + } // In case we resumed, initialized the transfer progress bar with the refill. pos, err := r.dataReader.Seek(0, io.SeekCurrent) diff --git a/roxctl/central/db/transfer/progress_bar.go b/roxctl/central/db/transfer/progress_bar.go index 08a5d7ad1bea2..ef6ca39fe461c 100644 --- a/roxctl/central/db/transfer/progress_bar.go +++ b/roxctl/central/db/transfer/progress_bar.go @@ -9,8 +9,8 @@ import ( "time" "github.com/stackrox/rox/pkg/concurrency" - "github.com/vbauerster/mpb/v4" - "github.com/vbauerster/mpb/v4/decor" + "github.com/vbauerster/mpb/v8" + "github.com/vbauerster/mpb/v8/decor" "golang.org/x/term" ) @@ -33,19 +33,19 @@ func newSingleCounterDecorator(fmt string) decor.Decorator { } } -func (d *singleCounterDecorator) Decor(st *decor.Statistics) string { +func (d *singleCounterDecorator) Decor(st decor.Statistics) (string, int) { str := fmt.Sprintf(d.fmt, decor.SizeB1024(st.Current)) - return d.FormatMsg(str) + return d.WC.Format(str) } type unknownTotalSizeFiller struct { tick int } -func (f *unknownTotalSizeFiller) Fill(w io.Writer, width int, _ *decor.Statistics) { +func (f *unknownTotalSizeFiller) Fill(w io.Writer, st decor.Statistics) error { f.tick++ - effectiveWidth := width - 2 + effectiveWidth := st.AvailableWidth - 2 arrowWidth := 5 arrowSpace := 10 @@ -61,7 +61,8 @@ func (f *unknownTotalSizeFiller) Fill(w io.Writer, width int, _ *decor.Statistic } } _, _ = bar.WriteRune(']') - _, _ = w.Write([]byte(bar.String())) + _, err := w.Write([]byte(bar.String())) + return err } func createProgressBars(_ context.Context, name string, totalSize int64) (*mpb.Bar, func()) { @@ -75,9 +76,9 @@ func createProgressBars(_ context.Context, name string, totalSize int64) (*mpb.B shutdownSig := concurrency.NewSignal() if !term.IsTerminal(int(outFile.Fd())) { - refreshC := make(chan time.Time, 1) + refreshC := make(chan interface{}, 1) refreshC <- time.Now() // first tick right away - shutdownNotifyC := make(chan struct{}) + shutdownNotifyC := make(chan interface{}) shutdownC := shutdownSig.Done() go func() { @@ -104,28 +105,35 @@ func createProgressBars(_ context.Context, name string, totalSize int64) (*mpb.B progressBars := mpb.New(opts...) - var filler mpb.Filler + var progressBar *mpb.Bar var counterDecorator decor.Decorator - if totalSize == 0 { - filler = &unknownTotalSizeFiller{} - counterDecorator = newSingleCounterDecorator("% 10.1f") - } else { - counterDecorator = decor.CountersKibiByte("% 10.1f / % 10.1f") - } appendedDecorators := []decor.Decorator{ - decor.AverageSpeed(decor.UnitKiB, "% 11.1f"), + decor.AverageSpeed(decor.SizeB1024(0), "% 11.1f"), decor.Name(fmt.Sprintf(" %s ", name)), } - if totalSize != 0 { + + if totalSize == 0 { + filler := &unknownTotalSizeFiller{} + counterDecorator = newSingleCounterDecorator("% 10.1f") + var err error + progressBar, err = progressBars.Add(totalSize, filler, + mpb.PrependDecorators(counterDecorator), + mpb.AppendDecorators(appendedDecorators...), + ) + if err != nil { + // Should not happen unless progressBars.Wait() was already called + panic(err) + } + } else { + counterDecorator = decor.CountersKibiByte("% 10.1f / % 10.1f") appendedDecorators = append(appendedDecorators, decor.AverageETA(decor.ET_STYLE_MMSS)) + progressBar = progressBars.AddBar(totalSize, + mpb.PrependDecorators(counterDecorator), + mpb.AppendDecorators(appendedDecorators...), + ) } - progressBar := progressBars.Add(totalSize, filler, - mpb.PrependDecorators(counterDecorator), - mpb.AppendDecorators(appendedDecorators...), - ) - shutdownFunc := func() { if totalSize == 0 && !progressBar.Completed() { progressBar.Abort(false) diff --git a/roxctl/central/db/transfer/transfer.go b/roxctl/central/db/transfer/transfer.go index e92f073350746..1e412fe81bc17 100644 --- a/roxctl/central/db/transfer/transfer.go +++ b/roxctl/central/db/transfer/transfer.go @@ -12,7 +12,7 @@ import ( "github.com/stackrox/rox/pkg/errox" "github.com/stackrox/rox/pkg/timestamp" "github.com/stackrox/rox/roxctl/common" - "github.com/vbauerster/mpb/v4" + "github.com/vbauerster/mpb/v8" ) type progressWatchReader struct {