]> Cypherpunks repositories - gostls13.git/commitdiff
gobuilder: fix windows builder
authorAlex Brainman <alex.brainman@gmail.com>
Thu, 9 Feb 2012 03:52:01 +0000 (14:52 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Thu, 9 Feb 2012 03:52:01 +0000 (14:52 +1100)
Do not rewrite commands if they have .bash extnsion.
Use path/filepath to manipulate file paths everywhere.
Use all.bat on windows, not all.bash.
Use HOMEDRIVE/HOMEPATH to find .gobuildkey on windows.

R=rsc
CC=golang-dev
https://golang.org/cl/5630062

misc/dashboard/builder/exec.go
misc/dashboard/builder/main.go

index 7f21abaa2747b59a7500c81511f1e2d8b02e2975..a500d234b9023d0a3e3ea62295f385691bb2ec24 100644 (file)
@@ -10,7 +10,6 @@ import (
        "log"
        "os"
        "os/exec"
-       "strings"
 )
 
 // run is a simple wrapper for exec.Run/Close
@@ -18,7 +17,6 @@ func run(envv []string, dir string, argv ...string) error {
        if *verbose {
                log.Println("run", argv)
        }
-       argv = useBash(argv)
        cmd := exec.Command(argv[0], argv[1:]...)
        cmd.Dir = dir
        cmd.Env = envv
@@ -35,7 +33,6 @@ func runLog(envv []string, logfile, dir string, argv ...string) (string, int, er
        if *verbose {
                log.Println("runLog", argv)
        }
-       argv = useBash(argv)
 
        b := new(bytes.Buffer)
        var w io.Writer = b
@@ -62,13 +59,3 @@ func runLog(envv []string, logfile, dir string, argv ...string) (string, int, er
        }
        return b.String(), 0, err
 }
-
-// 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 argv
-}
index c2e19bffd97d003274ca9f3279fb6f4364b9e517..e77107ec848943cb82c71b8d163bb0f3cd3d95a7 100644 (file)
@@ -12,7 +12,6 @@ import (
        "io/ioutil"
        "log"
        "os"
-       "path"
        "path/filepath"
        "regexp"
        "runtime"
@@ -49,12 +48,12 @@ type Builder struct {
 }
 
 var (
-       buildroot     = flag.String("buildroot", path.Join(os.TempDir(), "gobuilder"), "Directory under which to build")
+       buildroot     = flag.String("buildroot", filepath.Join(os.TempDir(), "gobuilder"), "Directory under which to build")
        commitFlag    = flag.Bool("commit", false, "upload information about new commits")
        dashboard     = flag.String("dashboard", "build.golang.org", "Go Dashboard Host")
        buildRelease  = flag.Bool("release", false, "Build and upload binary release archives")
        buildRevision = flag.String("rev", "", "Build specified revision and exit")
-       buildCmd      = flag.String("cmd", "./all.bash", "Build command (specify absolute or relative to go/src/)")
+       buildCmd      = flag.String("cmd", filepath.Join(".", allCmd), "Build command (specify relative to go/src/)")
        external      = flag.Bool("external", false, "Build external packages")
        parallel      = flag.Bool("parallel", false, "Build multiple targets in parallel")
        verbose       = flag.Bool("v", false, "verbose")
@@ -64,6 +63,9 @@ var (
        goroot      string
        binaryTagRe = regexp.MustCompile(`^(release\.r|weekly\.)[0-9\-.]+`)
        releaseRe   = regexp.MustCompile(`^release\.r[0-9\-.]+`)
+       allCmd      = "all" + suffix
+       cleanCmd    = "clean" + suffix
+       suffix      = defaultSuffix()
 )
 
 func main() {
@@ -76,7 +78,7 @@ func main() {
        if len(flag.Args()) == 0 && !*commitFlag {
                flag.Usage()
        }
-       goroot = path.Join(*buildroot, "goroot")
+       goroot = filepath.Join(*buildroot, "goroot")
        builders := make([]*Builder, len(flag.Args()))
        for i, builder := range flag.Args() {
                b, err := NewBuilder(builder)
@@ -171,7 +173,13 @@ func NewBuilder(builder string) (*Builder, error) {
        }
 
        // read keys from keyfile
-       fn := path.Join(os.Getenv("HOME"), ".gobuildkey")
+       fn := ""
+       if runtime.GOOS == "windows" {
+               fn = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
+       } else {
+               fn = os.Getenv("HOME")
+       }
+       fn = filepath.Join(fn, ".gobuildkey")
        if s := fn + "-" + b.name; isFile(s) { // builder-specific file
                fn = s
        }
@@ -257,7 +265,7 @@ func (b *Builder) buildHash(hash string) error {
        log.Println(b.name, "building", hash)
 
        // create place in which to do work
-       workpath := path.Join(*buildroot, b.name+"-"+hash[:12])
+       workpath := filepath.Join(*buildroot, b.name+"-"+hash[:12])
        if err := os.Mkdir(workpath, mkdirPerm); err != nil {
                return err
        }
@@ -269,16 +277,20 @@ func (b *Builder) buildHash(hash string) error {
        }
 
        // update to specified revision
-       if err := run(nil, path.Join(workpath, "go"), "hg", "update", hash); err != nil {
+       if err := run(nil, filepath.Join(workpath, "go"), "hg", "update", hash); err != nil {
                return err
        }
 
-       srcDir := path.Join(workpath, "go", "src")
+       srcDir := filepath.Join(workpath, "go", "src")
 
        // build
-       logfile := path.Join(workpath, "build.log")
+       logfile := filepath.Join(workpath, "build.log")
+       cmd := *buildCmd
+       if !filepath.IsAbs(cmd) {
+               cmd = filepath.Join(srcDir, cmd)
+       }
        startTime := time.Now()
-       buildLog, status, err := runLog(b.envv(), logfile, srcDir, *buildCmd)
+       buildLog, status, err := runLog(b.envv(), logfile, srcDir, cmd)
        runTime := time.Now().Sub(startTime)
        if err != nil {
                return fmt.Errorf("%s: %s", *buildCmd, err)
@@ -314,15 +326,16 @@ func (b *Builder) buildHash(hash string) error {
        releaseHash, release, err := firstTag(binaryTagRe)
        if hash == releaseHash {
                // clean out build state
-               if err := run(b.envv(), srcDir, "./clean.bash", "--nopkg"); err != nil {
-                       return fmt.Errorf("clean.bash: %s", err)
+               cmd := filepath.Join(srcDir, cleanCmd)
+               if err := run(b.envv(), srcDir, cmd, "--nopkg"); err != nil {
+                       return fmt.Errorf("%s: %s", cleanCmd, err)
                }
                // upload binary release
                fn := fmt.Sprintf("go.%s.%s-%s.tar.gz", release, b.goos, b.goarch)
                if err := run(nil, workpath, "tar", "czf", fn, "go"); err != nil {
                        return fmt.Errorf("tar: %s", err)
                }
-               err := run(nil, workpath, path.Join(goroot, codePyScript),
+               err := run(nil, workpath, filepath.Join(goroot, codePyScript),
                        "-s", release,
                        "-p", codeProject,
                        "-u", b.codeUsername,
@@ -556,7 +569,7 @@ func commitPoll(key, pkg string) {
        pkgRoot := goroot
 
        if pkg != "" {
-               pkgRoot = path.Join(*buildroot, pkg)
+               pkgRoot = filepath.Join(*buildroot, pkg)
                if !hgRepoExists(pkgRoot) {
                        if err := hgClone(repoURL(pkg), pkgRoot); err != nil {
                                log.Printf("%s: hg clone failed: %v", pkg, err)
@@ -719,3 +732,12 @@ func repoURL(importPath string) string {
        }
        return "https://code.google.com/p/" + m[1]
 }
+
+// defaultSuffix returns file extension used for command files in
+// current os environment.
+func defaultSuffix() string {
+       if runtime.GOOS == "windows" {
+               return ".bat"
+       }
+       return ".bash"
+}