mirror of
https://github.com/golang/go
synced 2024-11-19 23:24:45 -07: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:
parent
76dc4b1952
commit
232b2e3352
@ -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) {
|
func TestIssue22588(t *testing.T) {
|
||||||
// Don't get confused by stderr coming from tools.
|
// Don't get confused by stderr coming from tools.
|
||||||
tg := testgo(t)
|
tg := testgo(t)
|
||||||
|
@ -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
|
// isTestFile reports whether the source file is a set of tests and should therefore
|
||||||
// be excluded from coverage analysis.
|
// be excluded from coverage analysis.
|
||||||
func isTestFile(file string) bool {
|
func isTestFile(file string) bool {
|
||||||
@ -1186,6 +1184,7 @@ func isTestFile(file string) bool {
|
|||||||
// to the files, to be used when annotating the files.
|
// to the files, to be used when annotating the files.
|
||||||
func declareCoverVars(importPath string, files ...string) map[string]*load.CoverVar {
|
func declareCoverVars(importPath string, files ...string) map[string]*load.CoverVar {
|
||||||
coverVars := make(map[string]*load.CoverVar)
|
coverVars := make(map[string]*load.CoverVar)
|
||||||
|
coverIndex := 0
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if isTestFile(file) {
|
if isTestFile(file) {
|
||||||
continue
|
continue
|
||||||
|
@ -474,7 +474,10 @@ func (b *Builder) updateBuildID(a *Action, target string, rewrite bool) error {
|
|||||||
if a.output == nil {
|
if a.output == nil {
|
||||||
panic("internal error: a.output not set")
|
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)
|
c.PutBytes(cache.Subkey(a.actionID, "stdout"), a.output)
|
||||||
r.Close()
|
r.Close()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user