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  }