@@ -145,26 +145,20 @@ func Build(bin string) error {
145
145
"-complete" ,
146
146
}
147
147
148
- var in * os.File
149
148
cfg := filepath .Join (testdir , "importcfg.link" )
150
149
args = append (args , "-importcfg" , cfg )
151
- if _ , err := os .Stat (cfg ); err == nil {
152
- // there were go sources
153
- in , err = os .OpenFile (cfg , os .O_APPEND | os .O_WRONLY , 0600 )
154
- if err != nil {
155
- return err
156
- }
157
- } else {
150
+ if _ , err := os .Stat (cfg ); err != nil {
158
151
// there were no go sources in the directory
159
152
// so we need to build all dependency tree ourselves
160
- in , err = os .Create (cfg )
153
+ in , err : = os .Create (cfg )
161
154
if err != nil {
162
155
return err
163
156
}
164
157
fmt .Fprintln (in , "# import config" )
165
158
166
159
deps := make (map [string ]string )
167
- if err := dependencies (godogPkg , deps ); err != nil {
160
+ if err := dependencies (godogPkg , deps , false ); err != nil {
161
+ in .Close ()
168
162
return err
169
163
}
170
164
@@ -175,8 +169,30 @@ func Build(bin string) error {
175
169
}
176
170
fmt .Fprintf (in , "packagefile %s=%s\n " , pkgName , pkgObj )
177
171
}
172
+ in .Close ()
173
+ } else {
174
+ // need to make sure that vendor dependencies are mapped
175
+ in , err := os .OpenFile (cfg , os .O_APPEND | os .O_WRONLY , 0600 )
176
+ if err != nil {
177
+ return err
178
+ }
179
+ deps := make (map [string ]string )
180
+ if err := dependencies (pkg , deps , true ); err != nil {
181
+ in .Close ()
182
+ return err
183
+ }
184
+ if err := dependencies (godogPkg , deps , false ); err != nil {
185
+ in .Close ()
186
+ return err
187
+ }
188
+ for pkgName := range deps {
189
+ if i := strings .LastIndex (pkgName , "vendor/" ); i != - 1 {
190
+ name := pkgName [i + 7 :]
191
+ fmt .Fprintf (in , "importmap %s=%s\n " , name , pkgName )
192
+ }
193
+ }
194
+ in .Close ()
178
195
}
179
- in .Close ()
180
196
181
197
args = append (args , "-pack" , testmain )
182
198
cmd = exec .Command (compiler , args ... )
@@ -197,23 +213,21 @@ func Build(bin string) error {
197
213
cmd .Env = os .Environ ()
198
214
199
215
// in case if build is without contexts, need to remove import maps
200
- if testdir == workdir {
201
- data , err := ioutil .ReadFile (cfg )
202
- if err != nil {
203
- return err
204
- }
216
+ data , err := ioutil .ReadFile (cfg )
217
+ if err != nil {
218
+ return err
219
+ }
205
220
206
- lines := strings .Split (string (data ), "\n " )
207
- var fixed []string
208
- for _ , line := range lines {
209
- if strings .Index (line , "importmap" ) == 0 {
210
- continue
211
- }
212
- fixed = append (fixed , line )
213
- }
214
- if err := ioutil .WriteFile (cfg , []byte (strings .Join (fixed , "\n " )), 0600 ); err != nil {
215
- return err
221
+ lines := strings .Split (string (data ), "\n " )
222
+ var fixed []string
223
+ for _ , line := range lines {
224
+ if strings .Index (line , "importmap" ) == 0 {
225
+ continue
216
226
}
227
+ fixed = append (fixed , line )
228
+ }
229
+ if err := ioutil .WriteFile (cfg , []byte (strings .Join (fixed , "\n " )), 0600 ); err != nil {
230
+ return err
217
231
}
218
232
219
233
out , err = cmd .CombinedOutput ()
@@ -228,19 +242,7 @@ func Build(bin string) error {
228
242
}
229
243
230
244
func locatePackage (name string ) (* build.Package , error ) {
231
- for _ , p := range build .Default .SrcDirs () {
232
- abs , err := filepath .Abs (filepath .Join (p , name ))
233
- if err != nil {
234
- continue
235
- }
236
- pkg , err := build .ImportDir (abs , 0 )
237
- if err != nil {
238
- continue
239
- }
240
- return pkg , nil
241
- }
242
-
243
- // search vendor paths
245
+ // search vendor paths first since that takes priority
244
246
dir , err := filepath .Abs ("." )
245
247
if err != nil {
246
248
return nil , err
@@ -258,6 +260,19 @@ func locatePackage(name string) (*build.Package, error) {
258
260
}
259
261
}
260
262
263
+ // search source paths otherwise
264
+ for _ , p := range build .Default .SrcDirs () {
265
+ abs , err := filepath .Abs (filepath .Join (p , name ))
266
+ if err != nil {
267
+ continue
268
+ }
269
+ pkg , err := build .ImportDir (abs , 0 )
270
+ if err != nil {
271
+ continue
272
+ }
273
+ return pkg , nil
274
+ }
275
+
261
276
return nil , fmt .Errorf ("failed to find %s package in any of:\n %s" , name , strings .Join (build .Default .SrcDirs (), "\n " ))
262
277
}
263
278
@@ -365,9 +380,17 @@ func findToolDir() string {
365
380
return filepath .Clean (build .ToolDir )
366
381
}
367
382
368
- func dependencies (pkg * build.Package , visited map [string ]string ) error {
383
+ func dependencies (pkg * build.Package , visited map [string ]string , vendor bool ) error {
369
384
visited [pkg .ImportPath ] = pkg .PkgObj
370
- for _ , name := range pkg .Imports {
385
+ imports := pkg .Imports
386
+ if vendor {
387
+ imports = append (imports , pkg .TestImports ... )
388
+ }
389
+ for _ , name := range imports {
390
+ if i := strings .LastIndex (name , "vendor/" ); vendor && i == - 1 {
391
+ continue // only interested in vendor packages
392
+ }
393
+
371
394
if _ , ok := visited [name ]; ok {
372
395
continue
373
396
}
@@ -378,7 +401,7 @@ func dependencies(pkg *build.Package, visited map[string]string) error {
378
401
}
379
402
380
403
visited [name ] = pkg .PkgObj
381
- if err := dependencies (next , visited ); err != nil {
404
+ if err := dependencies (next , visited , vendor ); err != nil {
382
405
return err
383
406
}
384
407
}
0 commit comments