From 5692e00efbe72cddb939860ade7518732053adcb Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 7 Oct 2025 09:48:53 -0700 Subject: [PATCH 1/2] fix: allow progressbar to be updated afterwards --- progressbar.go | 5 +++++ progressbar_test.go | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/progressbar.go b/progressbar.go index 125290a..9b9adf3 100644 --- a/progressbar.go +++ b/progressbar.go @@ -956,6 +956,11 @@ func (p *ProgressBar) render() error { return err } } + // allow re-rendering when finished (e.g., when description is updated) + if !p.config.clearOnFinish { + io.Copy(p.config.writer, &p.config.stdBuffer) + renderProgressBar(p.config, &p.state) + } return nil } diff --git a/progressbar_test.go b/progressbar_test.go index c64f660..34ee7b4 100644 --- a/progressbar_test.go +++ b/progressbar_test.go @@ -853,6 +853,22 @@ func TestProgressBar_Describe(t *testing.T) { } } +func TestProgressBar_DescribeAfterFinish(t *testing.T) { + buf := strings.Builder{} + bar := NewOptions(100, + OptionSetDescription("Uploading files"), + OptionShowCount(), + OptionSetWriter(&buf), + OptionSetWidth(10), + ) + for i := 0; i < 100; i++ { + bar.Add(1) + } + bar.Describe("Upload complete") + result := buf.String() + assert.Contains(t, result, "Upload complete") +} + func TestRenderBlankStateWithThrottle(t *testing.T) { buf := strings.Builder{} bar := NewOptions(100, OptionSetWidth(10), OptionSetRenderBlankState(true), OptionThrottle(time.Millisecond), OptionSetWriter(&buf)) From 914e5115384a34d0fba6c0af91a68f9b3896226e Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 7 Oct 2025 09:57:21 -0700 Subject: [PATCH 2/2] fix: add describe solution --- progressbar.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/progressbar.go b/progressbar.go index 9b9adf3..e0bcf39 100644 --- a/progressbar.go +++ b/progressbar.go @@ -803,6 +803,13 @@ func (p *ProgressBar) Describe(description string) { if p.config.invisible { return } + // if already finished, re-render with the new description + if p.state.finished && !p.config.clearOnFinish && !p.config.useANSICodes { + clearProgressBar(p.config, p.state) + io.Copy(p.config.writer, &p.config.stdBuffer) + renderProgressBar(p.config, &p.state) + return + } p.render() } @@ -956,11 +963,6 @@ func (p *ProgressBar) render() error { return err } } - // allow re-rendering when finished (e.g., when description is updated) - if !p.config.clearOnFinish { - io.Copy(p.config.writer, &p.config.stdBuffer) - renderProgressBar(p.config, &p.state) - } return nil }