From 3e45412327a2654a77944249962b3652e6142299 Mon Sep 17 00:00:00 2001 From: Ondřej Surý Date: Mon, 17 Jan 2011 12:40:45 +0100 Subject: Imported Upstream version 2011.01.12 --- misc/dashboard/builder/exec.go | 65 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 misc/dashboard/builder/exec.go (limited to 'misc/dashboard/builder/exec.go') diff --git a/misc/dashboard/builder/exec.go b/misc/dashboard/builder/exec.go new file mode 100644 index 000000000..6236c915a --- /dev/null +++ b/misc/dashboard/builder/exec.go @@ -0,0 +1,65 @@ +package main + +import ( + "bytes" + "exec" + "io" + "os" + "strings" +) + +// run is a simple wrapper for exec.Run/Close +func run(envv []string, dir string, argv ...string) os.Error { + bin, err := pathLookup(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() +} + +// runLog runs a process and returns the combined stdout/stderr, +// as well as writing it to logfile (if specified). +func runLog(envv []string, logfile, dir string, argv ...string) (output string, exitStatus int, err os.Error) { + bin, err := pathLookup(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() + b := new(bytes.Buffer) + var w io.Writer = b + if logfile != "" { + f, err := os.Open(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) + if err != nil { + return + } + defer f.Close() + w = io.MultiWriter(f, b) + } + _, err = io.Copy(w, p.Stdout) + if err != nil { + return + } + wait, err := p.Wait(0) + if err != nil { + return + } + return b.String(), wait.WaitStatus.ExitStatus(), nil +} + +// Find bin in PATH if a relative or absolute path hasn't been specified +func pathLookup(s string) (string, os.Error) { + if strings.HasPrefix(s, "/") || strings.HasPrefix(s, "./") || strings.HasPrefix(s, "../") { + return s, nil + } + return exec.LookPath(s) +} -- cgit v1.2.3