| 4 | 4 |
"context"
|
| 5 | 5 |
"fmt"
|
| 6 | 6 |
"io"
|
| 7 | |
"log"
|
| 8 | 7 |
"runtime/debug"
|
| 9 | 8 |
"strings"
|
| 10 | 9 |
"sync"
|
|
| 35 | 34 |
cacheState *bState
|
| 36 | 35 |
|
| 37 | 36 |
container *Progress
|
| 38 | |
dlogger *log.Logger
|
| 39 | 37 |
recoveredPanic interface{}
|
| 40 | 38 |
}
|
| 41 | 39 |
|
|
| 80 | 78 |
}
|
| 81 | 79 |
|
| 82 | 80 |
func newBar(container *Progress, bs *bState) *Bar {
|
| 83 | |
logPrefix := fmt.Sprintf("%sbar#%02d ", container.dlogger.Prefix(), bs.id)
|
| 84 | 81 |
ctx, cancel := context.WithCancel(container.ctx)
|
| 85 | 82 |
|
| 86 | 83 |
bar := &Bar{
|
|
| 92 | 89 |
frameCh: make(chan *frame, 1),
|
| 93 | 90 |
done: make(chan struct{}),
|
| 94 | 91 |
cancel: cancel,
|
| 95 | |
dlogger: log.New(bs.debugOut, logPrefix, log.Lshortfile),
|
| 96 | 92 |
}
|
| 97 | 93 |
|
| 98 | 94 |
go bar.serve(ctx, bs)
|
|
| 345 | 341 |
// recovering if user defined decorator panics for example
|
| 346 | 342 |
if p := recover(); p != nil {
|
| 347 | 343 |
if b.recoveredPanic == nil {
|
|
344 |
if s.debugOut != nil {
|
|
345 |
fmt.Fprintln(s.debugOut, p)
|
|
346 |
_, _ = s.debugOut.Write(debug.Stack())
|
|
347 |
}
|
| 348 | 348 |
s.extender = makePanicExtender(p)
|
| 349 | 349 |
b.toShutdown = !b.toShutdown
|
| 350 | 350 |
b.recoveredPanic = p
|
| 351 | 351 |
}
|
| 352 | 352 |
reader, lines := s.extender(nil, s.reqWidth, stat)
|
| 353 | 353 |
b.frameCh <- &frame{reader, lines + 1}
|
| 354 | |
b.dlogger.Println(p)
|
| 355 | 354 |
}
|
| 356 | 355 |
s.completeFlushed = s.completed
|
| 357 | 356 |
}()
|
|
| 558 | 557 |
|
| 559 | 558 |
func makePanicExtender(p interface{}) extenderFunc {
|
| 560 | 559 |
pstr := fmt.Sprint(p)
|
| 561 | |
stack := debug.Stack()
|
| 562 | |
stackLines := bytes.Count(stack, []byte("\n"))
|
| 563 | 560 |
return func(_ io.Reader, _ int, st decor.Statistics) (io.Reader, int) {
|
| 564 | 561 |
mr := io.MultiReader(
|
| 565 | 562 |
strings.NewReader(runewidth.Truncate(pstr, st.AvailableWidth, "…")),
|
| 566 | |
strings.NewReader(fmt.Sprintf("\n%#v\n", st)),
|
| 567 | |
bytes.NewReader(stack),
|
|
563 |
strings.NewReader("\n"),
|
| 568 | 564 |
)
|
| 569 | |
return mr, stackLines + 1
|
| 570 | |
}
|
| 571 | |
}
|
|
565 |
return mr, 0
|
|
566 |
}
|
|
567 |
}
|