]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: fix build config for 'go list -cover'
authorThan McIntosh <thanm@google.com>
Tue, 13 Jun 2023 20:13:01 +0000 (16:13 -0400)
committerThan McIntosh <thanm@google.com>
Thu, 15 Jun 2023 23:07:39 +0000 (23:07 +0000)
When 'go list -cover' is run in a way that triggers package builds
(for example, -export), ensure that the build step actually includes
coverage instrumentation as part of the config. Without this we will
wind up with incorrect build IDs.

Fixes #60755.

Change-Id: Ic84ab9e301d075bee5ff9d6828370a1708be0035
Reviewed-on: https://go-review.googlesource.com/c/go/+/502877
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>

src/cmd/go/internal/list/list.go
src/cmd/go/testdata/script/cover_list.txt

index 1addadfea0103814236141af79d77b6fff8f395e..79120e6a99678576b7d9a4751cc3bb81d48b09c6 100644 (file)
@@ -730,6 +730,9 @@ func runList(ctx context.Context, cmd *base.Command, args []string) {
                                a.Deps = append(a.Deps, b.AutoAction(work.ModeInstall, work.ModeInstall, p))
                        }
                }
+               if cfg.Experiment.CoverageRedesign && cfg.BuildCover {
+                       load.PrepareForCoverageBuild(pkgs)
+               }
                b.Do(ctx, a)
        }
 
index c66c08779301c67dde0c906f16179c2e9de038a9..6b8aaf45d1e123e7b7b3d7036d7bb4f6ccc79a87 100644 (file)
@@ -16,6 +16,28 @@ go install m/example
 # with -cover.
 stale -cover m/example
 
+# Collect build ID from for m/example built with -cover.
+go list -cover -export -f '{{.BuildID}}' m/example
+cp stdout $WORK/listbuildid.txt
+
+# Now build the m/example binary with coverage.
+go build -cover -o $WORK/m.exe m/example
+
+# Ask for the binary build ID by running "go tool buildid".
+go tool buildid $WORK/m.exe
+cp stdout $WORK/rawtoolbuildid.txt
+
+# Make sure that the two build IDs agree with respect to the
+# m/example package. Build IDs from binaries are of the form X/Y/Z/W
+# where Y/Z is the package build ID; running the program below will
+# pick out the parts of the ID that we want.
+env GOCOVERDIR=$WORK
+exec $WORK/m.exe $WORK/rawtoolbuildid.txt
+cp stdout $WORK/toolbuildid.txt
+
+# Build IDs should match here.
+cmp $WORK/toolbuildid.txt $WORK/listbuildid.txt
+
 -- go.mod --
 module m
 
@@ -23,6 +45,21 @@ go 1.20
 -- example/main.go --
 package main
 
+import (
+       "fmt"
+       "os"
+       "strings"
+)
+
 func main() {
-     println("hi mom")
+       println(os.Args[1])
+       content, err := os.ReadFile(os.Args[1])
+       if err != nil {
+               os.Exit(1)
+       }
+       fields := strings.Split(strings.TrimSpace(string(content)), "/")
+       if len(fields) != 4 {
+               os.Exit(2)
+       }
+       fmt.Println(fields[1] + "/" + fields[2])
 }