github.com/zyedidia/knit@v1.1.2-0.20230901152954-f7d4e39a0e24/printer.go (about) 1 package knit 2 3 import ( 4 "fmt" 5 "io" 6 "path/filepath" 7 "sync" 8 9 pb "github.com/schollz/progressbar/v3" 10 ) 11 12 type BasicPrinter struct { 13 w io.Writer 14 lock sync.Mutex 15 } 16 17 func (p *BasicPrinter) SetSteps(int) {} 18 func (p *BasicPrinter) Update() {} 19 func (p *BasicPrinter) Clear() {} 20 func (p *BasicPrinter) Done(string) {} 21 func (p *BasicPrinter) NeedsUpdate() bool { return false } 22 23 func (p *BasicPrinter) Print(cmd, dir string, name string, step int) { 24 p.lock.Lock() 25 defer p.lock.Unlock() 26 if dir != "." { 27 fmt.Fprintf(p.w, "[%s] ", dir) 28 } 29 fmt.Fprintln(p.w, cmd) 30 } 31 32 type StepPrinter struct { 33 w io.Writer 34 lock sync.Mutex 35 steps int 36 last int 37 } 38 39 func (p *StepPrinter) SetSteps(steps int) { 40 p.steps = steps 41 } 42 func (p *StepPrinter) Update() {} 43 func (p *StepPrinter) Clear() {} 44 func (p *StepPrinter) Done(string) {} 45 func (p *StepPrinter) NeedsUpdate() bool { return false } 46 47 func (p *StepPrinter) Print(cmd, dir string, name string, step int) { 48 p.lock.Lock() 49 defer p.lock.Unlock() 50 if step <= p.last { 51 return 52 } 53 fmt.Fprintf(p.w, "[%d/%d] ", step, p.steps) 54 if dir != "." { 55 fmt.Fprintf(p.w, "[%s] ", dir) 56 } 57 fmt.Fprintln(p.w, name) 58 p.last = step 59 } 60 61 type ProgressPrinter struct { 62 w io.Writer 63 lock sync.Mutex 64 bar *pb.ProgressBar 65 tasks map[string]string 66 showCommands bool 67 } 68 69 func (p *ProgressPrinter) SetSteps(steps int) { 70 p.bar = pb.NewOptions64(int64(steps), 71 pb.OptionSetWriter(p.w), 72 pb.OptionSetWidth(10), 73 pb.OptionShowCount(), 74 pb.OptionSpinnerType(14), 75 pb.OptionFullWidth(), 76 pb.OptionSetPredictTime(false), 77 pb.OptionSetDescription("Building"), 78 pb.OptionOnCompletion(func() { 79 fmt.Fprint(p.w, "\n") 80 }), 81 pb.OptionSetTheme(pb.Theme{ 82 Saucer: "=", 83 SaucerHead: ">", 84 SaucerPadding: " ", 85 BarStart: "[", 86 BarEnd: "]", 87 })) 88 } 89 90 func (p *ProgressPrinter) NeedsUpdate() bool { return true } 91 92 func (p *ProgressPrinter) Update() { 93 p.lock.Lock() 94 defer p.lock.Unlock() 95 p.bar.RenderBlank() 96 fmt.Fprint(p.w, "\r") 97 } 98 99 func (p *ProgressPrinter) Clear() { 100 p.lock.Lock() 101 defer p.lock.Unlock() 102 p.bar.Clear() 103 fmt.Fprint(p.w, "\r") 104 } 105 106 func (p *ProgressPrinter) Print(cmd, dir string, name string, step int) { 107 p.lock.Lock() 108 defer p.lock.Unlock() 109 p.tasks[name] = cmd 110 111 if p.showCommands { 112 p.bar.Clear() 113 fmt.Fprint(p.w, "\r") 114 if dir != "." { 115 fmt.Fprintf(p.w, "[%s] ", dir) 116 } 117 fmt.Fprintln(p.w, cmd) 118 } 119 120 p.bar.Describe(p.desc()) 121 p.bar.RenderBlank() 122 } 123 124 func (p *ProgressPrinter) desc() string { 125 desc := "Building" 126 for k := range p.tasks { 127 desc += " " + fmt.Sprintf("%-40s", filepath.Base(k)) 128 break 129 } 130 return desc 131 } 132 133 func (p *ProgressPrinter) Done(name string) { 134 p.lock.Lock() 135 defer p.lock.Unlock() 136 delete(p.tasks, name) 137 if len(p.tasks) == 0 { 138 p.bar.Describe("Built " + name) 139 } else { 140 p.bar.Describe(p.desc()) 141 } 142 p.bar.Add(1) 143 }