1
0
mirror of https://github.com/golang/go synced 2024-10-02 16:28:34 -06:00

cmd/go: fix reuse of cached objects during cover

The cover variable indices could vary from build to build,
but they were not included in the build ID hash, so that
reusing the previously built package was not safe.
Make the indices no longer vary from build to build,
so that caching is safe.

Fixes #22652.

Change-Id: Ie26d73c648aadd285f97e0bf39619cabc3da54f2
Reviewed-on: https://go-review.googlesource.com/81515
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Russ Cox 2017-12-01 13:19:39 -05:00
parent 76dc4b1952
commit 232b2e3352
3 changed files with 21 additions and 3 deletions

View File

@ -4908,6 +4908,22 @@ func TestCacheOutput(t *testing.T) {
}
}
func TestCacheCoverage(t *testing.T) {
if strings.Contains(os.Getenv("GODEBUG"), "gocacheverify") {
t.Skip("GODEBUG gocacheverify")
}
tg := testgo(t)
defer tg.cleanup()
tg.parallel()
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
tg.makeTempdir()
tg.setenv("GOCACHE", filepath.Join(tg.tempdir, "c1"))
tg.run("test", "-cover", "strings")
tg.run("test", "-cover", "math", "strings")
}
func TestIssue22588(t *testing.T) {
// Don't get confused by stderr coming from tools.
tg := testgo(t)

View File

@ -1173,8 +1173,6 @@ func recompileForTest(pmain, preal, ptest *load.Package) {
}
}
var coverIndex = 0
// isTestFile reports whether the source file is a set of tests and should therefore
// be excluded from coverage analysis.
func isTestFile(file string) bool {
@ -1186,6 +1184,7 @@ func isTestFile(file string) bool {
// to the files, to be used when annotating the files.
func declareCoverVars(importPath string, files ...string) map[string]*load.CoverVar {
coverVars := make(map[string]*load.CoverVar)
coverIndex := 0
for _, file := range files {
if isTestFile(file) {
continue

View File

@ -474,7 +474,10 @@ func (b *Builder) updateBuildID(a *Action, target string, rewrite bool) error {
if a.output == nil {
panic("internal error: a.output not set")
}
c.Put(a.actionID, r)
outputID, _, err := c.Put(a.actionID, r)
if err == nil && cfg.BuildX {
b.Showcmd("", "%s # internal", joinUnambiguously(str.StringList("cp", target, c.OutputFile(outputID))))
}
c.PutBytes(cache.Subkey(a.actionID, "stdout"), a.output)
r.Close()
}