From 115436e038a83ae24b0e89aefd8309133b013e1c Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Tue, 30 Sep 2014 15:41:43 -0700 Subject: [PATCH] docker save: Do not save to a terminal. Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- api/client/commands.go | 4 +++ integration-cli/docker_cli_save_load_test.go | 31 ++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/api/client/commands.go b/api/client/commands.go index ba2e416d70..2747ca1b69 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -5,6 +5,7 @@ import ( "bytes" "encoding/base64" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -2365,7 +2366,10 @@ func (cli *DockerCli) CmdSave(args ...string) error { if err != nil { return err } + } else if cli.isTerminalOut { + return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.") } + if len(cmd.Args()) == 1 { image := cmd.Arg(0) if err := cli.stream("GET", "/images/"+image+"/get", nil, output, nil); err != nil { diff --git a/integration-cli/docker_cli_save_load_test.go b/integration-cli/docker_cli_save_load_test.go index 8632247b7d..b5e89c53a1 100644 --- a/integration-cli/docker_cli_save_load_test.go +++ b/integration-cli/docker_cli_save_load_test.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "fmt" "io/ioutil" "os" @@ -8,6 +9,8 @@ import ( "path/filepath" "reflect" "testing" + + "github.com/docker/docker/vendor/src/github.com/kr/pty" ) // save a repo and try to load it using stdout @@ -60,6 +63,34 @@ func TestSaveAndLoadRepoStdout(t *testing.T) { logDone("save - save a repo using stdout") logDone("load - load a repo using stdout") + + pty, tty, err := pty.Open() + if err != nil { + t.Fatalf("Could not open pty: %v", err) + } + cmd := exec.Command(dockerBinary, "save", repoName) + cmd.Stdin = tty + cmd.Stdout = tty + cmd.Stderr = tty + if err := cmd.Start(); err != nil { + t.Fatalf("start err: %v", err) + } + if err := cmd.Wait(); err == nil { + t.Fatal("did not break writing to a TTY") + } + + buf := make([]byte, 1024) + + n, err := pty.Read(buf) + if err != nil { + t.Fatal("could not read tty output") + } + + if !bytes.Contains(buf[:n], []byte("Cowardly refusing")) { + t.Fatal("help output is not being yielded", out) + } + + logDone("save - do not save to a tty") } func TestSaveSingleTag(t *testing.T) {