devtools/madb: use textutil.PrefixLineWriter
Now prefixer internally uses textutil.PrefixLineWriter instead.
Also switched the argument order to be consistent with PrefixLineWriter.
Change-Id: I05b824b87e96f1d2312e81ec31fe023fffddf6bc
diff --git a/exec.go b/exec.go
index 3866328..2aafef3 100644
--- a/exec.go
+++ b/exec.go
@@ -71,8 +71,8 @@
cmdArgs := append([]string{"-s", device}, args...)
cmd := sh.Cmd("adb", cmdArgs...)
- cmd.AddStdoutWriter(newPrefixer(device, os.Stdout))
- cmd.AddStderrWriter(newPrefixer(device, os.Stderr))
+ cmd.AddStdoutWriter(newPrefixer(os.Stdout, device))
+ cmd.AddStderrWriter(newPrefixer(os.Stderr, device))
cmd.Run()
return sh.Err
diff --git a/prefixer.go b/prefixer.go
index a67fdf5..ed2c573 100644
--- a/prefixer.go
+++ b/prefixer.go
@@ -5,65 +5,26 @@
package main
import (
- "bytes"
+ "fmt"
"io"
- "os"
+
+ "v.io/x/lib/textutil"
)
// prefixer is a io.WriteCloser that adds given prefix to each line of the output.
type prefixer struct {
- prefix []byte
- writer io.Writer
- buffer bytes.Buffer
+ textutil.WriteFlusher
}
// newPrefixer returns a new prefixer that uses the given prefix.
-func newPrefixer(prefix string, writer io.Writer) *prefixer {
+func newPrefixer(writer io.Writer, prefix string) *prefixer {
return &prefixer{
- prefix: []byte("[" + prefix + "]\t"),
- writer: writer,
- buffer: bytes.Buffer{},
+ WriteFlusher: textutil.PrefixLineWriter(writer, fmt.Sprintf("[%v]\t", prefix)),
}
}
-func (p *prefixer) Write(b []byte) (int, error) {
- // write the bytes to the buffer.
- p.buffer.Write(b)
-
- // For each line in the unread buffer, add the prefix and write it to the underlying writer.
- for {
- idx := bytes.IndexByte(p.buffer.Bytes(), '\n')
- if idx == -1 {
- break
- }
-
- prefixed := append(p.prefix, p.buffer.Next(idx+1)...)
- if _, err := p.writer.Write(prefixed); err != nil {
- return len(b), err
- }
- }
-
- return len(b), nil
-}
-
// Close flushes the remaining buffer content with prefix, and closes the underlying writer if applicable.
+// This internally calls Flush() on the underlying textutil.WriteFlusher.
func (p *prefixer) Close() error {
- // Flush the remaining buffer content if any.
- // Add the prefix at the beginning, and a newline character at the end.
- if p.buffer.Len() > 0 {
- prefixed := append(p.prefix, p.buffer.Bytes()...)
- prefixed = append(prefixed, '\n')
- if _, err := p.writer.Write(prefixed); err != nil {
- return err
- }
- }
-
- // Close the underlying writer unless the writer is stdout or stderr.
- if p.writer != os.Stdout && p.writer != os.Stderr {
- if closer, ok := p.writer.(io.Closer); ok {
- return closer.Close()
- }
- }
-
- return nil
+ return p.WriteFlusher.Flush()
}
diff --git a/prefixer_test.go b/prefixer_test.go
index 9a78c86..63e1332 100644
--- a/prefixer_test.go
+++ b/prefixer_test.go
@@ -12,7 +12,7 @@
func TestPrefixerSingleDevice(t *testing.T) {
buffer := bytes.Buffer{}
- prefixer := newPrefixer("deviceid01", &buffer)
+ prefixer := newPrefixer(&buffer, "deviceid01")
fmt.Fprintln(prefixer, "First line.")
fmt.Fprintln(prefixer, "Second line.")
@@ -30,8 +30,8 @@
func TestPrefixerTwoDevices(t *testing.T) {
// Two devices case
buffer := bytes.Buffer{}
- prefixer1 := newPrefixer("deviceid01", &buffer)
- prefixer2 := newPrefixer("deviceid02", &buffer)
+ prefixer1 := newPrefixer(&buffer, "deviceid01")
+ prefixer2 := newPrefixer(&buffer, "deviceid02")
fmt.Fprintf(prefixer2, "Second")
fmt.Fprintln(prefixer1, "First line.")
@@ -55,7 +55,7 @@
func TestPrefixerLastLine(t *testing.T) {
// For the last line, a newline character should be added automatically.
buffer := bytes.Buffer{}
- prefixer := newPrefixer("deviceid01", &buffer)
+ prefixer := newPrefixer(&buffer, "deviceid01")
fmt.Fprintf(prefixer, "First line.")
prefixer.Close()