// untested sections: 1 package gexec import ( "io" "sync" ) /* PrefixedWriter wraps an io.Writer, emitting 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 }