~john-koepi/ubuntu/trusty/golang/default

« back to all changes in this revision

Viewing changes to misc/dashboard/builder/exec.go

  • Committer: Bazaar Package Importer
  • Author(s): Ondřej Surý
  • Date: 2011-04-20 17:36:48 UTC
  • Revision ID: james.westby@ubuntu.com-20110420173648-ifergoxyrm832trd
Tags: upstream-2011.03.07.1
Import upstream version 2011.03.07.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2011 The Go Authors. All rights reserved.
 
2
// Use of this source code is governed by a BSD-style
 
3
// license that can be found in the LICENSE file.
 
4
 
 
5
package main
 
6
 
 
7
import (
 
8
        "bytes"
 
9
        "exec"
 
10
        "io"
 
11
        "log"
 
12
        "os"
 
13
        "strings"
 
14
)
 
15
 
 
16
// run is a simple wrapper for exec.Run/Close
 
17
func run(envv []string, dir string, argv ...string) os.Error {
 
18
        if *verbose {
 
19
                log.Println("run", argv)
 
20
        }
 
21
        bin, err := pathLookup(argv[0])
 
22
        if err != nil {
 
23
                return err
 
24
        }
 
25
        p, err := exec.Run(bin, argv, envv, dir,
 
26
                exec.DevNull, exec.DevNull, exec.PassThrough)
 
27
        if err != nil {
 
28
                return err
 
29
        }
 
30
        return p.Close()
 
31
}
 
32
 
 
33
// runLog runs a process and returns the combined stdout/stderr, 
 
34
// as well as writing it to logfile (if specified).
 
35
func runLog(envv []string, logfile, dir string, argv ...string) (output string, exitStatus int, err os.Error) {
 
36
        if *verbose {
 
37
                log.Println("runLog", argv)
 
38
        }
 
39
        bin, err := pathLookup(argv[0])
 
40
        if err != nil {
 
41
                return
 
42
        }
 
43
        p, err := exec.Run(bin, argv, envv, dir,
 
44
                exec.DevNull, exec.Pipe, exec.MergeWithStdout)
 
45
        if err != nil {
 
46
                return
 
47
        }
 
48
        defer p.Close()
 
49
        b := new(bytes.Buffer)
 
50
        var w io.Writer = b
 
51
        if logfile != "" {
 
52
                f, err := os.Open(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
 
53
                if err != nil {
 
54
                        return
 
55
                }
 
56
                defer f.Close()
 
57
                w = io.MultiWriter(f, b)
 
58
        }
 
59
        _, err = io.Copy(w, p.Stdout)
 
60
        if err != nil {
 
61
                return
 
62
        }
 
63
        wait, err := p.Wait(0)
 
64
        if err != nil {
 
65
                return
 
66
        }
 
67
        return b.String(), wait.WaitStatus.ExitStatus(), nil
 
68
}
 
69
 
 
70
// Find bin in PATH if a relative or absolute path hasn't been specified
 
71
func pathLookup(s string) (string, os.Error) {
 
72
        if strings.HasPrefix(s, "/") || strings.HasPrefix(s, "./") || strings.HasPrefix(s, "../") {
 
73
                return s, nil
 
74
        }
 
75
        return exec.LookPath(s)
 
76
}