summaryrefslogtreecommitdiff
path: root/misc/dashboard/builder/exec.go
diff options
context:
space:
mode:
Diffstat (limited to 'misc/dashboard/builder/exec.go')
-rw-r--r--misc/dashboard/builder/exec.go59
1 files changed, 28 insertions, 31 deletions
diff --git a/misc/dashboard/builder/exec.go b/misc/dashboard/builder/exec.go
index 988d216ce..0db509136 100644
--- a/misc/dashboard/builder/exec.go
+++ b/misc/dashboard/builder/exec.go
@@ -18,16 +18,12 @@ func run(envv []string, dir string, argv ...string) os.Error {
if *verbose {
log.Println("run", argv)
}
- bin, err := lookPath(argv[0])
- if err != nil {
- return err
- }
- p, err := exec.Run(bin, argv, envv, dir,
- exec.DevNull, exec.DevNull, exec.PassThrough)
- if err != nil {
- return err
- }
- return p.Close()
+ argv = useBash(argv)
+ cmd := exec.Command(argv[0], argv[1:]...)
+ cmd.Dir = dir
+ cmd.Env = envv
+ cmd.Stderr = os.Stderr
+ return cmd.Run()
}
// runLog runs a process and returns the combined stdout/stderr,
@@ -36,16 +32,8 @@ func runLog(envv []string, logfile, dir string, argv ...string) (output string,
if *verbose {
log.Println("runLog", argv)
}
- bin, err := lookPath(argv[0])
- if err != nil {
- return
- }
- p, err := exec.Run(bin, argv, envv, dir,
- exec.DevNull, exec.Pipe, exec.MergeWithStdout)
- if err != nil {
- return
- }
- defer p.Close()
+ argv = useBash(argv)
+
b := new(bytes.Buffer)
var w io.Writer = b
if logfile != "" {
@@ -56,21 +44,30 @@ func runLog(envv []string, logfile, dir string, argv ...string) (output string,
defer f.Close()
w = io.MultiWriter(f, b)
}
- _, err = io.Copy(w, p.Stdout)
- if err != nil {
- return
- }
- wait, err := p.Wait(0)
+
+ cmd := exec.Command(argv[0], argv[1:]...)
+ cmd.Dir = dir
+ cmd.Env = envv
+ cmd.Stdout = w
+ cmd.Stderr = w
+
+ err = cmd.Run()
+ output = b.String()
if err != nil {
+ if ws, ok := err.(*os.Waitmsg); ok {
+ exitStatus = ws.ExitStatus()
+ }
return
}
- return b.String(), wait.WaitStatus.ExitStatus(), nil
+ return
}
-// lookPath looks for cmd in $PATH if cmd does not begin with / or ./ or ../.
-func lookPath(cmd string) (string, os.Error) {
- if strings.HasPrefix(cmd, "/") || strings.HasPrefix(cmd, "./") || strings.HasPrefix(cmd, "../") {
- return cmd, nil
+// useBash prefixes a list of args with 'bash' if the first argument
+// is a bash script.
+func useBash(argv []string) []string {
+ // TODO(brainman): choose a more reliable heuristic here.
+ if strings.HasSuffix(argv[0], ".bash") {
+ argv = append([]string{"bash"}, argv...)
}
- return exec.LookPath(cmd)
+ return argv
}