| 42 | 42 |
reqWidth int
|
| 43 | 43 |
popPriority int
|
| 44 | 44 |
popCompleted bool
|
| 45 | |
outputDiscarded bool
|
| 46 | 45 |
disableAutoRefresh bool
|
| 47 | |
ignoreNotTTY bool
|
| 48 | 46 |
manualRefresh chan interface{}
|
| 49 | 47 |
renderDelay <-chan struct{}
|
| 50 | |
shutdownNotifier chan struct{}
|
|
48 |
shutdownNotifier chan<- interface{}
|
| 51 | 49 |
queueBars map[*Bar]*Bar
|
| 52 | 50 |
output io.Writer
|
| 53 | 51 |
debugOut io.Writer
|
|
| 89 | 87 |
operateState: make(chan func(*pState)),
|
| 90 | 88 |
interceptIo: make(chan func(io.Writer)),
|
| 91 | 89 |
done: make(chan struct{}),
|
|
90 |
shutdown: make(chan struct{}),
|
| 92 | 91 |
cancel: cancel,
|
| 93 | |
}
|
| 94 | |
|
| 95 | |
if s.shutdownNotifier != nil {
|
| 96 | |
p.shutdown = s.shutdownNotifier
|
| 97 | |
s.shutdownNotifier = nil
|
| 98 | |
} else {
|
| 99 | |
p.shutdown = make(chan struct{})
|
| 100 | 92 |
}
|
| 101 | 93 |
|
| 102 | 94 |
go p.serve(s, cwriter.New(s.output))
|
|
| 232 | 224 |
<-p.shutdown
|
| 233 | 225 |
}
|
| 234 | 226 |
|
| 235 | |
func (p *Progress) newTicker(s *pState) chan time.Time {
|
|
227 |
func (p *Progress) newTicker(s *pState, isTerminal bool) chan time.Time {
|
| 236 | 228 |
ch := make(chan time.Time)
|
| 237 | 229 |
go func() {
|
| 238 | 230 |
var autoRefresh <-chan time.Time
|
| 239 | |
if !s.disableAutoRefresh && !s.outputDiscarded {
|
|
231 |
if isTerminal && !s.disableAutoRefresh {
|
| 240 | 232 |
if s.renderDelay != nil {
|
| 241 | 233 |
<-s.renderDelay
|
| 242 | 234 |
}
|
|
| 264 | 256 |
}
|
| 265 | 257 |
|
| 266 | 258 |
func (p *Progress) serve(s *pState, cw *cwriter.Writer) {
|
|
259 |
render := func() error {
|
|
260 |
return s.render(cw)
|
|
261 |
}
|
| 267 | 262 |
|
| 268 | 263 |
go s.hm.run()
|
| 269 | 264 |
|
| 270 | |
refreshCh := p.newTicker(s)
|
|
265 |
refreshCh := p.newTicker(s, cw.IsTerminal())
|
| 271 | 266 |
|
| 272 | 267 |
for {
|
| 273 | 268 |
select {
|
|
| 276 | 271 |
case fn := <-p.interceptIo:
|
| 277 | 272 |
fn(cw)
|
| 278 | 273 |
case <-refreshCh:
|
| 279 | |
err := s.render(cw)
|
|
274 |
err := render()
|
| 280 | 275 |
if err != nil {
|
| 281 | |
refreshCh = nil
|
| 282 | 276 |
_, _ = fmt.Fprintln(s.debugOut, err.Error())
|
|
277 |
render = func() error { return nil }
|
| 283 | 278 |
p.cancel() // cancel all bars
|
| 284 | 279 |
}
|
| 285 | 280 |
case <-p.done:
|
| 286 | |
close(s.hm)
|
|
281 |
if s.shutdownNotifier != nil {
|
|
282 |
go func() {
|
|
283 |
s.shutdownNotifier <- s.hm.end()
|
|
284 |
}()
|
|
285 |
} else {
|
|
286 |
close(s.hm)
|
|
287 |
}
|
| 287 | 288 |
close(p.shutdown)
|
| 288 | 289 |
return
|
| 289 | 290 |
}
|
| 290 | 291 |
}
|
| 291 | 292 |
}
|
| 292 | 293 |
|
| 293 | |
func (s *pState) render(cw *cwriter.Writer) error {
|
| 294 | |
width, height, err := cw.GetTermSize()
|
| 295 | |
if err != nil {
|
| 296 | |
if !s.ignoreNotTTY {
|
|
294 |
func (s *pState) render(cw *cwriter.Writer) (err error) {
|
|
295 |
var width, height int
|
|
296 |
if cw.IsTerminal() {
|
|
297 |
width, height, err = cw.GetTermSize()
|
|
298 |
if err != nil {
|
| 297 | 299 |
return err
|
| 298 | 300 |
}
|
|
301 |
} else {
|
| 299 | 302 |
width = s.reqWidth
|
| 300 | 303 |
height = 100
|
| 301 | 304 |
}
|