| //go:build linux || darwin || freebsd || netbsd || openbsd || solaris || dragonfly || plan9 || aix |
| // +build linux darwin freebsd netbsd openbsd solaris dragonfly plan9 aix |
| |
| package pb |
| |
| import ( |
| "fmt" |
| "os" |
| "strings" |
| |
| "github.com/cheggaaa/pb/v3/termutil" |
| ) |
| |
| func (p *Pool) print(first bool) bool { |
| p.m.Lock() |
| defer p.m.Unlock() |
| var out string |
| if !first { |
| out = fmt.Sprintf("\033[%dA", p.lastBarsCount) |
| } |
| isFinished := true |
| bars := p.bars |
| rows, cols, err := termutil.TerminalSize() |
| if err != nil { |
| cols = defaultBarWidth |
| } |
| if rows > 0 && len(bars) > rows { |
| // we need to hide bars that overflow terminal height |
| bars = bars[len(bars)-rows:] |
| } |
| for _, bar := range bars { |
| if !bar.IsFinished() { |
| isFinished = false |
| } |
| bar.SetWidth(cols) |
| result := bar.String() |
| if r := cols - CellCount(result); r > 0 { |
| result += strings.Repeat(" ", r) |
| } |
| out += fmt.Sprintf("\r%s\n", result) |
| } |
| if p.Output != nil { |
| fmt.Fprint(p.Output, out) |
| } else { |
| fmt.Fprint(os.Stderr, out) |
| } |
| p.lastBarsCount = len(bars) |
| return isFinished |
| } |