From c2dea2196c336ba195ee713fd0020031d473500e Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 18 Feb 2010 18:32:33 -0800 Subject: [PATCH] exec: add dir argument to Run. fix, test MergeWithStdout R=r CC=golang-dev https://golang.org/cl/214046 --- src/cmd/hgpatch/main.go | 4 +-- src/pkg/exec/exec.go | 6 ++--- src/pkg/exec/exec_test.go | 57 ++++++++++++++++++++++++++++++++------- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/cmd/hgpatch/main.go b/src/cmd/hgpatch/main.go index 282122daa53..3d18971cf7b 100644 --- a/src/cmd/hgpatch/main.go +++ b/src/cmd/hgpatch/main.go @@ -346,12 +346,12 @@ func run(argv []string, input []byte) (out string, err os.Error) { // fmt.Fprintf(os.Stderr, "%v\n", argv); var cmd *exec.Cmd if len(input) == 0 { - cmd, err = exec.Run(prog, argv, os.Environ(), exec.DevNull, exec.Pipe, exec.MergeWithStdout) + cmd, err = exec.Run(prog, argv, os.Environ(), "", exec.DevNull, exec.Pipe, exec.MergeWithStdout) if err != nil { goto Error } } else { - cmd, err = exec.Run(prog, argv, os.Environ(), exec.Pipe, exec.Pipe, exec.MergeWithStdout) + cmd, err = exec.Run(prog, argv, os.Environ(), "", exec.Pipe, exec.Pipe, exec.MergeWithStdout) if err != nil { goto Error } diff --git a/src/pkg/exec/exec.go b/src/pkg/exec/exec.go index 8e959e03a3e..a1b7bd6b9c0 100644 --- a/src/pkg/exec/exec.go +++ b/src/pkg/exec/exec.go @@ -78,7 +78,7 @@ func modeToFiles(mode, fd int) (*os.File, *os.File, os.Error) { // If a parameter is Pipe, then the corresponding field (Stdin, Stdout, Stderr) // of the returned Cmd is the other end of the pipe. // Otherwise the field in Cmd is nil. -func Run(argv0 string, argv, envv []string, stdin, stdout, stderr int) (p *Cmd, err os.Error) { +func Run(argv0 string, argv, envv []string, dir string, stdin, stdout, stderr int) (p *Cmd, err os.Error) { p = new(Cmd) var fd [3]*os.File @@ -89,13 +89,13 @@ func Run(argv0 string, argv, envv []string, stdin, stdout, stderr int) (p *Cmd, goto Error } if stderr == MergeWithStdout { - p.Stderr = p.Stdout + fd[2] = fd[1] } else if fd[2], p.Stderr, err = modeToFiles(stderr, 2); err != nil { goto Error } // Run command. - p.Pid, err = os.ForkExec(argv0, argv, envv, "", &fd) + p.Pid, err = os.ForkExec(argv0, argv, envv, dir, &fd) if err != nil { goto Error } diff --git a/src/pkg/exec/exec_test.go b/src/pkg/exec/exec_test.go index 9c4d2ee319a..3e4ab7d7800 100644 --- a/src/pkg/exec/exec_test.go +++ b/src/pkg/exec/exec_test.go @@ -11,39 +11,76 @@ import ( ) func TestRunCat(t *testing.T) { - cmd, err := Run("/bin/cat", []string{"cat"}, nil, + cmd, err := Run("/bin/cat", []string{"cat"}, nil, "", Pipe, Pipe, DevNull) if err != nil { - t.Fatalf("opencmd /bin/cat: %v", err) + t.Fatal("run:", err) } io.WriteString(cmd.Stdin, "hello, world\n") cmd.Stdin.Close() buf, err := ioutil.ReadAll(cmd.Stdout) if err != nil { - t.Fatalf("reading from /bin/cat: %v", err) + t.Fatal("read:", err) } if string(buf) != "hello, world\n" { - t.Fatalf("reading from /bin/cat: got %q", buf) + t.Fatalf("read: got %q", buf) } if err = cmd.Close(); err != nil { - t.Fatalf("closing /bin/cat: %v", err) + t.Fatal("close:", err) } } func TestRunEcho(t *testing.T) { - cmd, err := Run("/bin/echo", []string{"echo", "hello", "world"}, nil, + cmd, err := Run("/bin/echo", []string{"echo", "hello", "world"}, nil, "", DevNull, Pipe, DevNull) if err != nil { - t.Fatalf("opencmd /bin/echo: %v", err) + t.Fatal("run:", err) } buf, err := ioutil.ReadAll(cmd.Stdout) if err != nil { - t.Fatalf("reading from /bin/echo: %v", err) + t.Fatal("read:", err) } if string(buf) != "hello world\n" { - t.Fatalf("reading from /bin/echo: got %q", buf) + t.Fatalf("read: got %q", buf) } if err = cmd.Close(); err != nil { - t.Fatalf("closing /bin/echo: %v", err) + t.Fatal("close:", err) + } +} + +func TestStderr(t *testing.T) { + cmd, err := Run("/bin/sh", []string{"sh", "-c", "echo hello world 1>&2"}, nil, "", + DevNull, DevNull, Pipe) + if err != nil { + t.Fatal("run:", err) + } + buf, err := ioutil.ReadAll(cmd.Stderr) + if err != nil { + t.Fatal("read:", err) + } + if string(buf) != "hello world\n" { + t.Fatalf("read: got %q", buf) + } + if err = cmd.Close(); err != nil { + t.Fatal("close:", err) + } +} + + +func TestMergeWithStdout(t *testing.T) { + cmd, err := Run("/bin/sh", []string{"sh", "-c", "echo hello world 1>&2"}, nil, "", + DevNull, Pipe, MergeWithStdout) + if err != nil { + t.Fatal("run:", err) + } + buf, err := ioutil.ReadAll(cmd.Stdout) + if err != nil { + t.Fatal("read:", err) + } + if string(buf) != "hello world\n" { + t.Fatalf("read: got %q", buf) + } + if err = cmd.Close(); err != nil { + t.Fatal("close:", err) } }