1
2
3
4
5
6
7 package work
8
9 import (
10 "cmd/go/internal/cfg"
11 "cmd/go/internal/str"
12 "cmd/internal/cov/covcmd"
13 "context"
14 "encoding/json"
15 "fmt"
16 "internal/coverage"
17 "io"
18 "os"
19 "path/filepath"
20 )
21
22
23
24 func (b *Builder) CovData(a *Action, cmdargs ...any) ([]byte, error) {
25 cmdline := str.StringList(cmdargs...)
26 args := append([]string{}, cfg.BuildToolexec...)
27 args = append(args, "go", "tool", "covdata")
28 args = append(args, cmdline...)
29 return b.Shell(a).runOut(a.Objdir, nil, args)
30 }
31
32
33
34
35
36
37 func BuildActionCoverMetaFile(runAct *Action) (string, error) {
38 p := runAct.Package
39 for i := range runAct.Deps {
40 pred := runAct.Deps[i]
41 if pred.Mode != "build" || pred.Package == nil {
42 continue
43 }
44 if pred.Package.ImportPath == p.ImportPath {
45 metaFile := pred.Objdir + covcmd.MetaFileForPackage(p.ImportPath)
46 if cfg.BuildN {
47 return metaFile, nil
48 }
49 f, err := os.Open(metaFile)
50 if err != nil {
51 return "", err
52 }
53 defer f.Close()
54 fi, err2 := f.Stat()
55 if err2 != nil {
56 return "", err2
57 }
58 if fi.Size() == 0 {
59 return "", nil
60 }
61 return metaFile, nil
62 }
63 }
64 return "", fmt.Errorf("internal error: unable to locate build action for package %q run action", p.ImportPath)
65 }
66
67
68
69
70
71
72
73 func WriteCoveragePercent(b *Builder, runAct *Action, mf string, w io.Writer) error {
74 dir := filepath.Dir(mf)
75 output, cerr := b.CovData(runAct, "percent", "-i", dir)
76 if cerr != nil {
77 return b.Shell(runAct).reportCmd("", "", output, cerr)
78 }
79 _, werr := w.Write(output)
80 return werr
81 }
82
83
84
85
86
87
88 func WriteCoverageProfile(b *Builder, runAct *Action, mf, outf string, w io.Writer) error {
89 dir := filepath.Dir(mf)
90 output, err := b.CovData(runAct, "textfmt", "-i", dir, "-o", outf)
91 if err != nil {
92 return b.Shell(runAct).reportCmd("", "", output, err)
93 }
94 _, werr := w.Write(output)
95 return werr
96 }
97
98
99
100
101
102
103
104
105
106
107
108
109
110 func WriteCoverMetaFilesFile(b *Builder, ctx context.Context, a *Action) error {
111 sh := b.Shell(a)
112
113
114 var collection coverage.MetaFileCollection
115 for i := range a.Deps {
116 dep := a.Deps[i]
117 if dep.Mode != "build" {
118 panic("unexpected mode " + dep.Mode)
119 }
120 metaFilesFile := dep.Objdir + covcmd.MetaFileForPackage(dep.Package.ImportPath)
121
122
123 if fi, err := os.Stat(metaFilesFile); err != nil {
124 continue
125 } else if fi.Size() == 0 {
126 continue
127 }
128 collection.ImportPaths = append(collection.ImportPaths, dep.Package.ImportPath)
129 collection.MetaFileFragments = append(collection.MetaFileFragments, metaFilesFile)
130 }
131
132
133 data, err := json.Marshal(collection)
134 if err != nil {
135 return fmt.Errorf("marshal MetaFileCollection: %v", err)
136 }
137 data = append(data, '\n')
138
139
140
141
142 if err := sh.Mkdir(a.Objdir); err != nil {
143 return err
144 }
145 mfpath := a.Objdir + coverage.MetaFilesFileName
146 if err := sh.writeFile(mfpath, data); err != nil {
147 return fmt.Errorf("writing metafiles file: %v", err)
148 }
149
150
151 return nil
152 }
153
View as plain text