|  | 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 | 
|  | } |