diff options
| author | Gustavo Niemeyer <gustavo@niemeyer.net> | 2011-02-01 12:12:51 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2011-02-01 12:12:51 -0500 |
| commit | 59a47732dd2273f7077cb717d4aedf8c3d64aa5a (patch) | |
| tree | ad6f0182a2f211277f19af3c74c0c2ee46203a09 /src/pkg/exec | |
| parent | e6a934a1d9258a6990724774995770d9bb5fea4b (diff) | |
| download | go-59a47732dd2273f7077cb717d4aedf8c3d64aa5a.tar.xz | |
exec: use custom error for LookPath
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
Diffstat (limited to 'src/pkg/exec')
| -rw-r--r-- | src/pkg/exec/exec.go | 11 | ||||
| -rw-r--r-- | src/pkg/exec/lp_test.go | 33 | ||||
| -rw-r--r-- | src/pkg/exec/lp_unix.go | 4 | ||||
| -rw-r--r-- | src/pkg/exec/lp_windows.go | 4 |
4 files changed, 48 insertions, 4 deletions
diff --git a/src/pkg/exec/exec.go b/src/pkg/exec/exec.go index ba9bd2472a..4f4c8c7770 100644 --- a/src/pkg/exec/exec.go +++ b/src/pkg/exec/exec.go @@ -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 index 0000000000..0ef6d252fa --- /dev/null +++ b/src/pkg/exec/lp_test.go @@ -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) + } + } +} diff --git a/src/pkg/exec/lp_unix.go b/src/pkg/exec/lp_unix.go index 292e24fccd..44f84347b9 100644 --- a/src/pkg/exec/lp_unix.go +++ b/src/pkg/exec/lp_unix.go @@ -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} } diff --git a/src/pkg/exec/lp_windows.go b/src/pkg/exec/lp_windows.go index 7b56afa856..d357575fdb 100644 --- a/src/pkg/exec/lp_windows.go +++ b/src/pkg/exec/lp_windows.go @@ -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} } |
