podman
1// untested sections: 1
2
3package gexec
4
5import (
6"io"
7"sync"
8)
9
10/*
11PrefixedWriter wraps an io.Writer, emitting the passed in prefix at the beginning of each new line.
12This can be useful when running multiple gexec.Sessions concurrently - you can prefix the log output of each
13session by passing in a PrefixedWriter:
14
15gexec.Start(cmd, NewPrefixedWriter("[my-cmd] ", GinkgoWriter), NewPrefixedWriter("[my-cmd] ", GinkgoWriter))
16*/
17type PrefixedWriter struct {
18prefix []byte
19writer io.Writer
20lock *sync.Mutex
21atStartOfLine bool
22}
23
24func NewPrefixedWriter(prefix string, writer io.Writer) *PrefixedWriter {
25return &PrefixedWriter{
26prefix: []byte(prefix),
27writer: writer,
28lock: &sync.Mutex{},
29atStartOfLine: true,
30}
31}
32
33func (w *PrefixedWriter) Write(b []byte) (int, error) {
34w.lock.Lock()
35defer w.lock.Unlock()
36
37toWrite := []byte{}
38
39for _, c := range b {
40if w.atStartOfLine {
41toWrite = append(toWrite, w.prefix...)
42}
43
44toWrite = append(toWrite, c)
45
46w.atStartOfLine = c == '\n'
47}
48
49_, err := w.writer.Write(toWrite)
50if err != nil {
51return 0, err
52}
53
54return len(b), nil
55}
56