]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: fix race libraries rebuilding by `go test -i`
authorAlexander Menzhinsky <amenzhinsky@gmail.com>
Fri, 3 Mar 2017 12:57:19 +0000 (15:57 +0300)
committerIan Lance Taylor <iant@golang.org>
Fri, 17 Mar 2017 17:49:29 +0000 (17:49 +0000)
`go test -i -race` adds the "sync/atomic" package to every package dependency tree
that makes buildIDs different from packages installed with `go install -race`
and causes cache rebuilding.

Fixes #19133
Fixes #19151

Change-Id: I0536c6fa41b0d20fe361b5d35b3c0937b146d07d
Reviewed-on: https://go-review.googlesource.com/37598
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/go/internal/cfg/cfg.go
src/cmd/go/internal/load/pkg.go
src/cmd/go/internal/test/test.go
src/cmd/go/internal/test/testflag.go

index 48b9e81e2da132dc023cec2f174c44627ecbae03..6850fde2be6160296059e113be2b8c9b45d006e8 100644 (file)
@@ -41,9 +41,6 @@ func init() {
        BuildToolchainLinker = func() string { return "missing-linker" }
 }
 
-// The test coverage mode affects package loading. Sigh.
-var TestCoverMode string // -covermode flag
-
 // An EnvVar is an environment variable Name=Value.
 type EnvVar struct {
        Name  string
index bf91bb74ada5dd9112e4d2d63a86fd801a9c8738..1609459ef8ebced0ae8c6faf59e381a9c9b08813 100644 (file)
@@ -959,10 +959,6 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) *Package
                if p.Name == "main" && cfg.Goarch == "arm" {
                        ImportPaths = append(ImportPaths, "math")
                }
-               // In coverage atomic mode everything depends on sync/atomic.
-               if cfg.TestCoverMode == "atomic" && (!p.Standard || (p.ImportPath != "runtime/cgo" && p.ImportPath != "runtime/race" && p.ImportPath != "sync/atomic")) {
-                       ImportPaths = append(ImportPaths, "sync/atomic")
-               }
        }
 
        // Runtime and its internal packages depend on runtime/internal/sys,
index a3f95b1548f204f7bf8589732d76e89c3d63ec7b..961466c2ff72bdf500fa1b784de397e6f9ac73cd 100644 (file)
@@ -388,9 +388,9 @@ See the documentation of the testing package for more information.
 }
 
 var (
-       testC     bool // -c flag
-       testCover bool // -cover flag
-       // Note: testCoverMode is cfg.TestCoverMode (-covermode)
+       testC            bool            // -c flag
+       testCover        bool            // -cover flag
+       testCoverMode    string          // -covermode flag
        testCoverPaths   []string        // -coverpkg flag
        testCoverPkgs    []*load.Package // -coverpkg flag
        testO            string          // -o flag
@@ -548,7 +548,7 @@ func runTest(cmd *base.Command, args []string) {
                        p.Stale = true // rebuild
                        p.StaleReason = "rebuild for coverage"
                        p.Internal.Fake = true // do not warn about rebuild
-                       p.Internal.CoverMode = cfg.TestCoverMode
+                       p.Internal.CoverMode = testCoverMode
                        var coverFiles []string
                        coverFiles = append(coverFiles, p.GoFiles...)
                        coverFiles = append(coverFiles, p.CgoFiles...)
@@ -559,6 +559,11 @@ func runTest(cmd *base.Command, args []string) {
 
        // Prepare build + run + print actions for all packages being tested.
        for _, p := range pkgs {
+               // sync/atomic import is inserted by the cover tool. See #18486
+               if testCover && testCoverMode == "atomic" {
+                       ensureImport(p, "sync/atomic")
+               }
+
                buildTest, runTest, printTest, err := builderTest(&b, p)
                if err != nil {
                        str := err.Error()
@@ -650,6 +655,23 @@ func runTest(cmd *base.Command, args []string) {
        b.Do(root)
 }
 
+// ensures that package p imports the named package
+func ensureImport(p *load.Package, pkg string) {
+       for _, d := range p.Internal.Deps {
+               if d.Name == pkg {
+                       return
+               }
+       }
+
+       a := load.LoadPackage(pkg, &load.ImportStack{})
+       if a.Error != nil {
+               base.Fatalf("load %s: %v", pkg, a.Error)
+       }
+       load.ComputeStale(a)
+
+       p.Internal.Imports = append(p.Internal.Imports, a)
+}
+
 var windowsBadWords = []string{
        "install",
        "patch",
@@ -788,7 +810,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin
                ptest.Internal.Build.ImportPos = m
 
                if localCover {
-                       ptest.Internal.CoverMode = cfg.TestCoverMode
+                       ptest.Internal.CoverMode = testCoverMode
                        var coverFiles []string
                        coverFiles = append(coverFiles, ptest.GoFiles...)
                        coverFiles = append(coverFiles, ptest.CgoFiles...)
@@ -1361,7 +1383,7 @@ type testFuncs struct {
 }
 
 func (t *testFuncs) CoverMode() string {
-       return cfg.TestCoverMode
+       return testCoverMode
 }
 
 func (t *testFuncs) CoverEnabled() bool {
index 1c44af5a0053fce6b961aa7d20ef7a5696e0faa9..a89afb312e722ce6592845100c91f889a52937d8 100644 (file)
@@ -174,7 +174,7 @@ func testFlags(args []string) (packageNames, passToTest []string) {
                        case "covermode":
                                switch value {
                                case "set", "count", "atomic":
-                                       cfg.TestCoverMode = value
+                                       testCoverMode = value
                                default:
                                        base.Fatalf("invalid flag argument for -covermode: %q", value)
                                }
@@ -191,11 +191,11 @@ func testFlags(args []string) (packageNames, passToTest []string) {
                }
        }
 
-       if cfg.TestCoverMode == "" {
-               cfg.TestCoverMode = "set"
+       if testCoverMode == "" {
+               testCoverMode = "set"
                if cfg.BuildRace {
                        // Default coverage mode is atomic when -race is set.
-                       cfg.TestCoverMode = "atomic"
+                       testCoverMode = "atomic"
                }
        }