From faf67db089c6b2168fb1bab99b4385d374c64efe Mon Sep 17 00:00:00 2001 From: Jeremy Schlatter Date: Mon, 17 Feb 2025 13:37:40 -0800 Subject: [PATCH] cmd: fix progress bar flickering Previous code cleared the display before writing new content, creating a window where the terminal could (and in some cases did) render empty lines. Instead, we now write new content over the old content, only clearing the trailing end of lines for cases where the new line is shorter. Fixes #1664 --- progress/progress.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/progress/progress.go b/progress/progress.go index 102830a82..580d8123a 100644 --- a/progress/progress.go +++ b/progress/progress.go @@ -84,17 +84,16 @@ func (p *Progress) render() { fmt.Fprint(p.w, "\033[?25l") defer fmt.Fprint(p.w, "\033[?25h") - // clear already rendered progress lines - for i := range p.pos { - if i > 0 { - fmt.Fprint(p.w, "\033[A") - } - fmt.Fprint(p.w, "\033[2K\033[1G") + // move the cursor back to the beginning + for range p.pos - 1 { + fmt.Fprint(p.w, "\033[A") } + fmt.Fprint(p.w, "\033[1G") // render progress lines for i, state := range p.states { fmt.Fprint(p.w, state.String()) + fmt.Fprintf(p.w, "\033[K") if i < len(p.states)-1 { fmt.Fprint(p.w, "\n") }