github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/util/logutil/pause.go (about) 1 package logutil 2 3 import ( 4 "bytes" 5 "io" 6 "sync" 7 8 "github.com/sirupsen/logrus" 9 ) 10 11 func Pause(l *logrus.Logger) func() { 12 // initialize formatter with original terminal settings 13 l.Formatter.Format(logrus.NewEntry(l)) 14 15 bw := newBufferedWriter(l.Out) 16 l.SetOutput(bw) 17 return func() { 18 bw.resume() 19 } 20 } 21 22 type bufferedWriter struct { 23 mu sync.Mutex 24 buf *bytes.Buffer 25 w io.Writer 26 } 27 28 func newBufferedWriter(w io.Writer) *bufferedWriter { 29 return &bufferedWriter{ 30 buf: bytes.NewBuffer(nil), 31 w: w, 32 } 33 } 34 35 func (bw *bufferedWriter) Write(p []byte) (int, error) { 36 bw.mu.Lock() 37 defer bw.mu.Unlock() 38 if bw.buf == nil { 39 return bw.w.Write(p) 40 } 41 return bw.buf.Write(p) 42 } 43 44 func (bw *bufferedWriter) resume() { 45 bw.mu.Lock() 46 defer bw.mu.Unlock() 47 if bw.buf == nil { 48 return 49 } 50 io.Copy(bw.w, bw.buf) 51 bw.buf = nil 52 }