mage: Init packages once
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 30 Aug 2018 10:28:29 +0000 (12:28 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 30 Aug 2018 11:36:33 +0000 (13:36 +0200)
`go list ./...` fails when run in parallel on Windows. This also applies to running `go test ./...` and `go list/...` so we serialize tests.

magefile.go

index 91c79b1ddc09866b90c8d22f4990fc2cd12dd938..b00b3bbe41a49c1f3dcac23de210e0a4ab4d9564 100644 (file)
@@ -12,6 +12,7 @@ import (
        "path/filepath"
        "runtime"
        "strings"
+       "sync"
        "time"
 
        "github.com/magefile/mage/mg"
@@ -98,7 +99,11 @@ func Check() {
                fmt.Printf("Skip Check on %s\n", runtime.Version())
                return
        }
-       mg.Deps(Test386, Fmt, Vet)
+
+       mg.Deps(Test386)
+
+       mg.Deps(Fmt, Vet)
+
        // don't run two tests in parallel, they saturate the CPUs anyway, and running two
        // causes memory issues in CI.
        mg.Deps(TestRace)
@@ -161,18 +166,26 @@ func Fmt() error {
        return nil
 }
 
-var pkgPrefixLen = len("github.com/gohugoio/hugo")
+var (
+       pkgPrefixLen = len("github.com/gohugoio/hugo")
+       pkgs         []string
+       pkgsInit     sync.Once
+)
 
 func hugoPackages() ([]string, error) {
-       s, err := sh.Output(goexe, "list", "./...")
-       if err != nil {
-               return nil, err
-       }
-       pkgs := strings.Split(s, "\n")
-       for i := range pkgs {
-               pkgs[i] = "." + pkgs[i][pkgPrefixLen:]
-       }
-       return pkgs, nil
+       var err error
+       pkgsInit.Do(func() {
+               var s string
+               s, err = sh.Output(goexe, "list", "./...")
+               if err != nil {
+                       return
+               }
+               pkgs = strings.Split(s, "\n")
+               for i := range pkgs {
+                       pkgs[i] = "." + pkgs[i][pkgPrefixLen:]
+               }
+       })
+       return pkgs, err
 }
 
 // Run golint linter