]> Cypherpunks repositories - gostls13.git/commitdiff
exec: use custom error for LookPath
authorGustavo Niemeyer <gustavo@niemeyer.net>
Tue, 1 Feb 2011 17:12:51 +0000 (12:12 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 1 Feb 2011 17:12:51 +0000 (12:12 -0500)
Make the error message and the needed action more obvious
when a command isn't found to obtain the source code
of a project.  Users seem to strugle with the existing
wording in practice.

R=rsc
CC=golang-dev
https://golang.org/cl/4058047

src/cmd/goinstall/main.go
src/pkg/exec/exec.go
src/pkg/exec/lp_test.go [new file with mode: 0644]
src/pkg/exec/lp_unix.go
src/pkg/exec/lp_windows.go

index b0f08efdf26498955e395bcf33f3cb47baaf8442..f13aeb3bc072731cb76b87907dcf69ce8d5a27f5 100644 (file)
@@ -244,8 +244,7 @@ func quietRun(dir string, stdin []byte, cmd ...string) os.Error {
 func genRun(dir string, stdin []byte, cmd []string, quiet bool) os.Error {
        bin, err := exec.LookPath(cmd[0])
        if err != nil {
-               // report binary as well as the error
-               return os.NewError(cmd[0] + ": " + err.String())
+               return err
        }
        p, err := exec.Run(bin, cmd, os.Environ(), dir, exec.Pipe, exec.Pipe, exec.MergeWithStdout)
        if *verbose {
index ba9bd2472a4b17e13951596c2032a802c407c084..4f4c8c777019e9c78e90982f3047bab65d038ed6 100644 (file)
@@ -7,6 +7,7 @@ package exec
 
 import (
        "os"
+       "strconv"
 )
 
 // Arguments to Run.
@@ -29,6 +30,16 @@ type Cmd struct {
        Pid    int
 }
 
+// PathError records the name of a binary that was not
+// found on the current $PATH.
+type PathError struct {
+       Name string
+}
+
+func (e *PathError) String() string {
+       return "command " + strconv.Quote(e.Name) + " not found in $PATH"
+}
+
 // Given mode (DevNull, etc), return file for child
 // and file to record in Cmd structure.
 func modeToFiles(mode, fd int) (*os.File, *os.File, os.Error) {
diff --git a/src/pkg/exec/lp_test.go b/src/pkg/exec/lp_test.go
new file mode 100644 (file)
index 0000000..0ef6d25
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package exec
+
+import (
+       "testing"
+)
+
+var nonExistentPaths = []string{
+       "some-non-existent-path",
+       "non-existent-path/slashed",
+}
+
+func TestLookPathNotFound(t *testing.T) {
+       for _, name := range nonExistentPaths {
+               path, err := LookPath(name)
+               if err == nil {
+                       t.Fatalf("LookPath found %q in $PATH", name)
+               }
+               if path != "" {
+                       t.Fatalf("LookPath path == %q when err != nil", path)
+               }
+               perr, ok := err.(*PathError)
+               if !ok {
+                       t.Fatal("LookPath error is not a PathError")
+               }
+               if perr.Name != name {
+                       t.Fatal("want PathError name %q, got %q", name, perr.Name)
+               }
+       }
+}
index 292e24fccddd20b3efeb843392de59506c39a210..44f84347b99c4f71476382002ec9b5dca75c73df 100644 (file)
@@ -29,7 +29,7 @@ func LookPath(file string) (string, os.Error) {
                if canExec(file) {
                        return file, nil
                }
-               return "", &os.PathError{"lookpath", file, os.ENOENT}
+               return "", &PathError{file}
        }
        pathenv := os.Getenv("PATH")
        for _, dir := range strings.Split(pathenv, ":", -1) {
@@ -41,5 +41,5 @@ func LookPath(file string) (string, os.Error) {
                        return dir + "/" + file, nil
                }
        }
-       return "", &os.PathError{"lookpath", file, os.ENOENT}
+       return "", &PathError{file}
 }
index 7b56afa85664fc40ad76e38ae09fd7258db9843e..d357575fdbe884b66e486ec1b278e1285fe58cc0 100644 (file)
@@ -49,7 +49,7 @@ func LookPath(file string) (string, os.Error) {
                if f, ok := canExec(file, exts); ok {
                        return f, nil
                }
-               return ``, &os.PathError{"lookpath", file, os.ENOENT}
+               return ``, &PathError{file}
        }
        if pathenv := os.Getenv(`PATH`); pathenv == `` {
                if f, ok := canExec(`.\`+file, exts); ok {
@@ -62,5 +62,5 @@ func LookPath(file string) (string, os.Error) {
                        }
                }
        }
-       return ``, &os.PathError{"lookpath", file, os.ENOENT}
+       return ``, &PathError{file}
 }