| package gexec |
| |
| import ( |
| "io" |
| "sync" |
| ) |
| |
| /* |
| PrefixedWriter wraps an io.Writer, emiting the passed in prefix at the beginning of each new line. |
| This can be useful when running multiple gexec.Sessions concurrently - you can prefix the log output of each |
| session by passing in a PrefixedWriter: |
| |
| gexec.Start(cmd, NewPrefixedWriter("[my-cmd] ", GinkgoWriter), NewPrefixedWriter("[my-cmd] ", GinkgoWriter)) |
| */ |
| type PrefixedWriter struct { |
| prefix []byte |
| writer io.Writer |
| lock *sync.Mutex |
| atStartOfLine bool |
| } |
| |
| func NewPrefixedWriter(prefix string, writer io.Writer) *PrefixedWriter { |
| return &PrefixedWriter{ |
| prefix: []byte(prefix), |
| writer: writer, |
| lock: &sync.Mutex{}, |
| atStartOfLine: true, |
| } |
| } |
| |
| func (w *PrefixedWriter) Write(b []byte) (int, error) { |
| w.lock.Lock() |
| defer w.lock.Unlock() |
| |
| toWrite := []byte{} |
| |
| for _, c := range b { |
| if w.atStartOfLine { |
| toWrite = append(toWrite, w.prefix...) |
| } |
| |
| toWrite = append(toWrite, c) |
| |
| w.atStartOfLine = c == '\n' |
| } |
| |
| _, err := w.writer.Write(toWrite) |
| if err != nil { |
| return 0, err |
| } |
| |
| return len(b), nil |
| } |