mirror of
https://github.com/golang/go.git
synced 2025-05-30 19:52:53 +00:00
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
This commit is contained in:
parent
e6a934a1d9
commit
59a47732dd
@ -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 {
|
func genRun(dir string, stdin []byte, cmd []string, quiet bool) os.Error {
|
||||||
bin, err := exec.LookPath(cmd[0])
|
bin, err := exec.LookPath(cmd[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// report binary as well as the error
|
return err
|
||||||
return os.NewError(cmd[0] + ": " + err.String())
|
|
||||||
}
|
}
|
||||||
p, err := exec.Run(bin, cmd, os.Environ(), dir, exec.Pipe, exec.Pipe, exec.MergeWithStdout)
|
p, err := exec.Run(bin, cmd, os.Environ(), dir, exec.Pipe, exec.Pipe, exec.MergeWithStdout)
|
||||||
if *verbose {
|
if *verbose {
|
||||||
|
@ -7,6 +7,7 @@ package exec
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Arguments to Run.
|
// Arguments to Run.
|
||||||
@ -29,6 +30,16 @@ type Cmd struct {
|
|||||||
Pid int
|
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
|
// Given mode (DevNull, etc), return file for child
|
||||||
// and file to record in Cmd structure.
|
// and file to record in Cmd structure.
|
||||||
func modeToFiles(mode, fd int) (*os.File, *os.File, os.Error) {
|
func modeToFiles(mode, fd int) (*os.File, *os.File, os.Error) {
|
||||||
|
33
src/pkg/exec/lp_test.go
Normal file
33
src/pkg/exec/lp_test.go
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -29,7 +29,7 @@ func LookPath(file string) (string, os.Error) {
|
|||||||
if canExec(file) {
|
if canExec(file) {
|
||||||
return file, nil
|
return file, nil
|
||||||
}
|
}
|
||||||
return "", &os.PathError{"lookpath", file, os.ENOENT}
|
return "", &PathError{file}
|
||||||
}
|
}
|
||||||
pathenv := os.Getenv("PATH")
|
pathenv := os.Getenv("PATH")
|
||||||
for _, dir := range strings.Split(pathenv, ":", -1) {
|
for _, dir := range strings.Split(pathenv, ":", -1) {
|
||||||
@ -41,5 +41,5 @@ func LookPath(file string) (string, os.Error) {
|
|||||||
return dir + "/" + file, nil
|
return dir + "/" + file, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "", &os.PathError{"lookpath", file, os.ENOENT}
|
return "", &PathError{file}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ func LookPath(file string) (string, os.Error) {
|
|||||||
if f, ok := canExec(file, exts); ok {
|
if f, ok := canExec(file, exts); ok {
|
||||||
return f, nil
|
return f, nil
|
||||||
}
|
}
|
||||||
return ``, &os.PathError{"lookpath", file, os.ENOENT}
|
return ``, &PathError{file}
|
||||||
}
|
}
|
||||||
if pathenv := os.Getenv(`PATH`); pathenv == `` {
|
if pathenv := os.Getenv(`PATH`); pathenv == `` {
|
||||||
if f, ok := canExec(`.\`+file, exts); ok {
|
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}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user