@@ -72,6 +72,28 @@ func (r *responseDeduper) addRoot(id string) {
72
72
r .dr .Roots = append (r .dr .Roots , id )
73
73
}
74
74
75
+ // goInfo contains global information from the go tool.
76
+ type goInfo struct {
77
+ rootDirs map [string ]string
78
+ env goEnv
79
+ }
80
+
81
+ type goEnv struct {
82
+ modulesOn bool
83
+ }
84
+
85
+ func determineEnv (cfg * Config ) goEnv {
86
+ buf , err := invokeGo (cfg , "env" , "GOMOD" )
87
+ if err != nil {
88
+ return goEnv {}
89
+ }
90
+ gomod := bytes .TrimSpace (buf .Bytes ())
91
+
92
+ env := goEnv {}
93
+ env .modulesOn = len (gomod ) > 0
94
+ return env
95
+ }
96
+
75
97
// goListDriver uses the go list command to interpret the patterns and produce
76
98
// the build system package structure.
77
99
// See driver for more details.
@@ -88,20 +110,25 @@ func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
88
110
}
89
111
90
112
// start fetching rootDirs
91
- var rootDirs map [ string ] string
92
- var rootDirsReady = make (chan struct {})
113
+ var info goInfo
114
+ var rootDirsReady , envReady = make ( chan struct {}), make (chan struct {})
93
115
go func () {
94
- rootDirs = determineRootDirs (cfg )
116
+ info . rootDirs = determineRootDirs (cfg )
95
117
close (rootDirsReady )
96
118
}()
97
- getRootDirs := func () map [string ]string {
119
+ go func () {
120
+ info .env = determineEnv (cfg )
121
+ close (envReady )
122
+ }()
123
+ getGoInfo := func () * goInfo {
98
124
<- rootDirsReady
99
- return rootDirs
125
+ <- envReady
126
+ return & info
100
127
}
101
128
102
- // always pass getRootDirs to golistDriver
129
+ // always pass getGoInfo to golistDriver
103
130
golistDriver := func (cfg * Config , patterns ... string ) (* driverResponse , error ) {
104
- return golistDriver (cfg , getRootDirs , patterns ... )
131
+ return golistDriver (cfg , getGoInfo , patterns ... )
105
132
}
106
133
107
134
// Determine files requested in contains patterns
@@ -165,7 +192,7 @@ extractQueries:
165
192
var containsCandidates []string
166
193
167
194
if len (containFiles ) != 0 {
168
- if err := runContainsQueries (cfg , golistDriver , response , containFiles , getRootDirs ); err != nil {
195
+ if err := runContainsQueries (cfg , golistDriver , response , containFiles , getGoInfo ); err != nil {
169
196
return nil , err
170
197
}
171
198
}
@@ -176,15 +203,15 @@ extractQueries:
176
203
}
177
204
}
178
205
179
- modifiedPkgs , needPkgs , err := processGolistOverlay (cfg , response , getRootDirs )
206
+ modifiedPkgs , needPkgs , err := processGolistOverlay (cfg , response , getGoInfo )
180
207
if err != nil {
181
208
return nil , err
182
209
}
183
210
if len (containFiles ) > 0 {
184
211
containsCandidates = append (containsCandidates , modifiedPkgs ... )
185
212
containsCandidates = append (containsCandidates , needPkgs ... )
186
213
}
187
- if err := addNeededOverlayPackages (cfg , golistDriver , response , needPkgs , getRootDirs ); err != nil {
214
+ if err := addNeededOverlayPackages (cfg , golistDriver , response , needPkgs , getGoInfo ); err != nil {
188
215
return nil , err
189
216
}
190
217
// Check candidate packages for containFiles.
@@ -216,28 +243,33 @@ extractQueries:
216
243
return response .dr , nil
217
244
}
218
245
219
- func addNeededOverlayPackages (cfg * Config , driver driver , response * responseDeduper , pkgs []string , getRootDirs func () map [ string ] string ) error {
246
+ func addNeededOverlayPackages (cfg * Config , driver driver , response * responseDeduper , pkgs []string , getGoInfo func () * goInfo ) error {
220
247
if len (pkgs ) == 0 {
221
248
return nil
222
249
}
223
- dr , err := driver (cfg , pkgs ... )
250
+ drivercfg := * cfg
251
+ if getGoInfo ().env .modulesOn {
252
+ drivercfg .BuildFlags = append (drivercfg .BuildFlags , "-mod=readonly" )
253
+ }
254
+ dr , err := driver (& drivercfg , pkgs ... )
255
+
224
256
if err != nil {
225
257
return err
226
258
}
227
259
for _ , pkg := range dr .Packages {
228
260
response .addPackage (pkg )
229
261
}
230
- _ , needPkgs , err := processGolistOverlay (cfg , response , getRootDirs )
262
+ _ , needPkgs , err := processGolistOverlay (cfg , response , getGoInfo )
231
263
if err != nil {
232
264
return err
233
265
}
234
- if err := addNeededOverlayPackages (cfg , driver , response , needPkgs , getRootDirs ); err != nil {
266
+ if err := addNeededOverlayPackages (cfg , driver , response , needPkgs , getGoInfo ); err != nil {
235
267
return err
236
268
}
237
269
return nil
238
270
}
239
271
240
- func runContainsQueries (cfg * Config , driver driver , response * responseDeduper , queries []string , rootDirs func () map [ string ] string ) error {
272
+ func runContainsQueries (cfg * Config , driver driver , response * responseDeduper , queries []string , goInfo func () * goInfo ) error {
241
273
for _ , query := range queries {
242
274
// TODO(matloob): Do only one query per directory.
243
275
fdir := filepath .Dir (query )
@@ -600,7 +632,7 @@ func otherFiles(p *jsonPackage) [][]string {
600
632
// golistDriver uses the "go list" command to expand the pattern
601
633
// words and return metadata for the specified packages. dir may be
602
634
// "" and env may be nil, as per os/exec.Command.
603
- func golistDriver (cfg * Config , rootsDirs func () map [ string ] string , words ... string ) (* driverResponse , error ) {
635
+ func golistDriver (cfg * Config , rootsDirs func () * goInfo , words ... string ) (* driverResponse , error ) {
604
636
// go list uses the following identifiers in ImportPath and Imports:
605
637
//
606
638
// "p" -- importable package or main (command)
@@ -759,8 +791,8 @@ func golistDriver(cfg *Config, rootsDirs func() map[string]string, words ...stri
759
791
}
760
792
761
793
// getPkgPath finds the package path of a directory if it's relative to a root directory.
762
- func getPkgPath (dir string , rootDirs func () map [ string ] string ) (string , bool ) {
763
- for rdir , rpath := range rootDirs () {
794
+ func getPkgPath (dir string , goInfo func () * goInfo ) (string , bool ) {
795
+ for rdir , rpath := range goInfo (). rootDirs {
764
796
// TODO(matloob): This doesn't properly handle symlinks.
765
797
r , err := filepath .Rel (rdir , dir )
766
798
if err != nil {
0 commit comments