Commit e2e4c9f6 authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

packer: errors go to stderr [GH-868]

parent 1c655365
...@@ -83,6 +83,7 @@ func DefaultEnvironmentConfig() *EnvironmentConfig { ...@@ -83,6 +83,7 @@ func DefaultEnvironmentConfig() *EnvironmentConfig {
config.Ui = &BasicUi{ config.Ui = &BasicUi{
Reader: os.Stdin, Reader: os.Stdin,
Writer: os.Stdout, Writer: os.Stdout,
ErrorWriter: os.Stderr,
} }
return config return config
......
...@@ -32,6 +32,7 @@ func testEnvironment() Environment { ...@@ -32,6 +32,7 @@ func testEnvironment() Environment {
config.Ui = &BasicUi{ config.Ui = &BasicUi{
Reader: new(bytes.Buffer), Reader: new(bytes.Buffer),
Writer: new(bytes.Buffer), Writer: new(bytes.Buffer),
ErrorWriter: new(bytes.Buffer),
} }
env, err := NewEnvironment(config) env, err := NewEnvironment(config)
......
...@@ -61,6 +61,7 @@ type TargettedUi struct { ...@@ -61,6 +61,7 @@ type TargettedUi struct {
type BasicUi struct { type BasicUi struct {
Reader io.Reader Reader io.Reader
Writer io.Writer Writer io.Writer
ErrorWriter io.Writer
l sync.Mutex l sync.Mutex
interrupted bool interrupted bool
} }
...@@ -235,8 +236,13 @@ func (rw *BasicUi) Error(message string) { ...@@ -235,8 +236,13 @@ func (rw *BasicUi) Error(message string) {
rw.l.Lock() rw.l.Lock()
defer rw.l.Unlock() defer rw.l.Unlock()
writer := rw.ErrorWriter
if writer == nil {
writer = rw.Writer
}
log.Printf("ui error: %s", message) log.Printf("ui error: %s", message)
_, err := fmt.Fprint(rw.Writer, message+"\n") _, err := fmt.Fprint(writer, message+"\n")
if err != nil { if err != nil {
log.Printf("[ERR] Failed to write to UI: %s", err) log.Printf("[ERR] Failed to write to UI: %s", err)
} }
......
...@@ -7,10 +7,27 @@ import ( ...@@ -7,10 +7,27 @@ import (
"testing" "testing"
) )
// This reads the output from the bytes.Buffer in our test object
// and then resets the buffer.
func readWriter(ui *BasicUi) (result string) {
buffer := ui.Writer.(*bytes.Buffer)
result = buffer.String()
buffer.Reset()
return
}
func readErrorWriter(ui *BasicUi) (result string) {
buffer := ui.ErrorWriter.(*bytes.Buffer)
result = buffer.String()
buffer.Reset()
return
}
func testUi() *BasicUi { func testUi() *BasicUi {
return &BasicUi{ return &BasicUi{
Reader: new(bytes.Buffer), Reader: new(bytes.Buffer),
Writer: new(bytes.Buffer), Writer: new(bytes.Buffer),
ErrorWriter: new(bytes.Buffer),
} }
} }
...@@ -32,6 +49,11 @@ func TestColoredUi(t *testing.T) { ...@@ -32,6 +49,11 @@ func TestColoredUi(t *testing.T) {
ui.Error("foo") ui.Error("foo")
result = readWriter(bufferUi) result = readWriter(bufferUi)
if result != "" {
t.Fatalf("invalid output: %s", result)
}
result = readErrorWriter(bufferUi)
if result != "\033[1;31mfoo\033[0m\n" { if result != "\033[1;31mfoo\033[0m\n" {
t.Fatalf("invalid output: %s", result) t.Fatalf("invalid output: %s", result)
} }
...@@ -59,7 +81,7 @@ func TestColoredUi_noColorEnv(t *testing.T) { ...@@ -59,7 +81,7 @@ func TestColoredUi_noColorEnv(t *testing.T) {
} }
ui.Error("foo") ui.Error("foo")
result = readWriter(bufferUi) result = readErrorWriter(bufferUi)
if result != "foo\n" { if result != "foo\n" {
t.Fatalf("invalid output: %s", result) t.Fatalf("invalid output: %s", result)
} }
...@@ -88,7 +110,7 @@ func TestTargettedUi(t *testing.T) { ...@@ -88,7 +110,7 @@ func TestTargettedUi(t *testing.T) {
} }
targettedUi.Error("bar") targettedUi.Error("bar")
actual = readWriter(bufferUi) actual = readErrorWriter(bufferUi)
expected = "==> foo: bar\n" expected = "==> foo: bar\n"
if actual != expected { if actual != expected {
t.Fatalf("bad: %#v", actual) t.Fatalf("bad: %#v", actual)
...@@ -131,12 +153,13 @@ func TestBasicUi_Error(t *testing.T) { ...@@ -131,12 +153,13 @@ func TestBasicUi_Error(t *testing.T) {
var actual, expected string var actual, expected string
bufferUi.Error("foo") bufferUi.Error("foo")
actual = readWriter(bufferUi) actual = readErrorWriter(bufferUi)
expected = "foo\n" expected = "foo\n"
if actual != expected { if actual != expected {
t.Fatalf("bad: %#v", actual) t.Fatalf("bad: %#v", actual)
} }
bufferUi.ErrorWriter = nil
bufferUi.Error("5") bufferUi.Error("5")
actual = readWriter(bufferUi) actual = readWriter(bufferUi)
expected = "5\n" expected = "5\n"
...@@ -214,12 +237,3 @@ func TestMachineReadableUi(t *testing.T) { ...@@ -214,12 +237,3 @@ func TestMachineReadableUi(t *testing.T) {
t.Fatalf("bad: %#v", data) t.Fatalf("bad: %#v", data)
} }
} }
// This reads the output from the bytes.Buffer in our test object
// and then resets the buffer.
func readWriter(ui *BasicUi) (result string) {
buffer := ui.Writer.(*bytes.Buffer)
result = buffer.String()
buffer.Reset()
return
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment