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