1
0
mirror of https://github.com/golang/go synced 2024-09-30 13:18:34 -06:00

cmd/go: fix race libraries rebuilding by go test -i

`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>
This commit is contained in:
Alexander Menzhinsky 2017-03-03 15:57:19 +03:00 committed by Ian Lance Taylor
parent b9f6b22a01
commit be04da8f0c
4 changed files with 32 additions and 17 deletions

View File

@ -41,9 +41,6 @@ func init() {
BuildToolchainLinker = func() string { return "missing-linker" } 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. // An EnvVar is an environment variable Name=Value.
type EnvVar struct { type EnvVar struct {
Name string Name string

View File

@ -959,10 +959,6 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) *Package
if p.Name == "main" && cfg.Goarch == "arm" { if p.Name == "main" && cfg.Goarch == "arm" {
ImportPaths = append(ImportPaths, "math") 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, // Runtime and its internal packages depend on runtime/internal/sys,

View File

@ -388,9 +388,9 @@ See the documentation of the testing package for more information.
} }
var ( var (
testC bool // -c flag testC bool // -c flag
testCover bool // -cover flag testCover bool // -cover flag
// Note: testCoverMode is cfg.TestCoverMode (-covermode) testCoverMode string // -covermode flag
testCoverPaths []string // -coverpkg flag testCoverPaths []string // -coverpkg flag
testCoverPkgs []*load.Package // -coverpkg flag testCoverPkgs []*load.Package // -coverpkg flag
testO string // -o flag testO string // -o flag
@ -548,7 +548,7 @@ func runTest(cmd *base.Command, args []string) {
p.Stale = true // rebuild p.Stale = true // rebuild
p.StaleReason = "rebuild for coverage" p.StaleReason = "rebuild for coverage"
p.Internal.Fake = true // do not warn about rebuild p.Internal.Fake = true // do not warn about rebuild
p.Internal.CoverMode = cfg.TestCoverMode p.Internal.CoverMode = testCoverMode
var coverFiles []string var coverFiles []string
coverFiles = append(coverFiles, p.GoFiles...) coverFiles = append(coverFiles, p.GoFiles...)
coverFiles = append(coverFiles, p.CgoFiles...) 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. // Prepare build + run + print actions for all packages being tested.
for _, p := range pkgs { 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) buildTest, runTest, printTest, err := builderTest(&b, p)
if err != nil { if err != nil {
str := err.Error() str := err.Error()
@ -650,6 +655,23 @@ func runTest(cmd *base.Command, args []string) {
b.Do(root) 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{ var windowsBadWords = []string{
"install", "install",
"patch", "patch",
@ -788,7 +810,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin
ptest.Internal.Build.ImportPos = m ptest.Internal.Build.ImportPos = m
if localCover { if localCover {
ptest.Internal.CoverMode = cfg.TestCoverMode ptest.Internal.CoverMode = testCoverMode
var coverFiles []string var coverFiles []string
coverFiles = append(coverFiles, ptest.GoFiles...) coverFiles = append(coverFiles, ptest.GoFiles...)
coverFiles = append(coverFiles, ptest.CgoFiles...) coverFiles = append(coverFiles, ptest.CgoFiles...)
@ -1361,7 +1383,7 @@ type testFuncs struct {
} }
func (t *testFuncs) CoverMode() string { func (t *testFuncs) CoverMode() string {
return cfg.TestCoverMode return testCoverMode
} }
func (t *testFuncs) CoverEnabled() bool { func (t *testFuncs) CoverEnabled() bool {

View File

@ -174,7 +174,7 @@ func testFlags(args []string) (packageNames, passToTest []string) {
case "covermode": case "covermode":
switch value { switch value {
case "set", "count", "atomic": case "set", "count", "atomic":
cfg.TestCoverMode = value testCoverMode = value
default: default:
base.Fatalf("invalid flag argument for -covermode: %q", value) base.Fatalf("invalid flag argument for -covermode: %q", value)
} }
@ -191,11 +191,11 @@ func testFlags(args []string) (packageNames, passToTest []string) {
} }
} }
if cfg.TestCoverMode == "" { if testCoverMode == "" {
cfg.TestCoverMode = "set" testCoverMode = "set"
if cfg.BuildRace { if cfg.BuildRace {
// Default coverage mode is atomic when -race is set. // Default coverage mode is atomic when -race is set.
cfg.TestCoverMode = "atomic" testCoverMode = "atomic"
} }
} }