]> Cypherpunks repositories - gostls13.git/commitdiff
exec: add dir argument to Run.
authorRuss Cox <rsc@golang.org>
Fri, 19 Feb 2010 02:32:33 +0000 (18:32 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 19 Feb 2010 02:32:33 +0000 (18:32 -0800)
fix, test MergeWithStdout

R=r
CC=golang-dev
https://golang.org/cl/214046

src/cmd/hgpatch/main.go
src/pkg/exec/exec.go
src/pkg/exec/exec_test.go

index 282122daa53b436ce2adfa7567219bfd510a7b3e..3d18971cf7bcb462d6fe3ec740693a3c0bd75fa4 100644 (file)
@@ -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
                }
index 8e959e03a3e99ff27b71241b69f63b016ba7645e..a1b7bd6b9c069a081499a7b4de4471aec51d3a08 100644 (file)
@@ -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
        }
index 9c4d2ee319ad56678a6b76dbf888c28a6e4b3c7d..3e4ab7d780070660c5ee88a8f9f3139e1d217136 100644 (file)
@@ -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)
        }
 }