Skip to content

Commit 0371765

Browse files
committed
adapts vendoring support for go1.10, should close #118
1 parent f9aabcd commit 0371765

File tree

1 file changed

+65
-42
lines changed

1 file changed

+65
-42
lines changed

builder_go110.go

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -145,26 +145,20 @@ func Build(bin string) error {
145145
"-complete",
146146
}
147147

148-
var in *os.File
149148
cfg := filepath.Join(testdir, "importcfg.link")
150149
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 {
158151
// there were no go sources in the directory
159152
// so we need to build all dependency tree ourselves
160-
in, err = os.Create(cfg)
153+
in, err := os.Create(cfg)
161154
if err != nil {
162155
return err
163156
}
164157
fmt.Fprintln(in, "# import config")
165158

166159
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()
168162
return err
169163
}
170164

@@ -175,8 +169,30 @@ func Build(bin string) error {
175169
}
176170
fmt.Fprintf(in, "packagefile %s=%s\n", pkgName, pkgObj)
177171
}
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()
178195
}
179-
in.Close()
180196

181197
args = append(args, "-pack", testmain)
182198
cmd = exec.Command(compiler, args...)
@@ -197,23 +213,21 @@ func Build(bin string) error {
197213
cmd.Env = os.Environ()
198214

199215
// 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+
}
205220

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
216226
}
227+
fixed = append(fixed, line)
228+
}
229+
if err := ioutil.WriteFile(cfg, []byte(strings.Join(fixed, "\n")), 0600); err != nil {
230+
return err
217231
}
218232

219233
out, err = cmd.CombinedOutput()
@@ -228,19 +242,7 @@ func Build(bin string) error {
228242
}
229243

230244
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
244246
dir, err := filepath.Abs(".")
245247
if err != nil {
246248
return nil, err
@@ -258,6 +260,19 @@ func locatePackage(name string) (*build.Package, error) {
258260
}
259261
}
260262

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+
261276
return nil, fmt.Errorf("failed to find %s package in any of:\n%s", name, strings.Join(build.Default.SrcDirs(), "\n"))
262277
}
263278

@@ -365,9 +380,17 @@ func findToolDir() string {
365380
return filepath.Clean(build.ToolDir)
366381
}
367382

368-
func dependencies(pkg *build.Package, visited map[string]string) error {
383+
func dependencies(pkg *build.Package, visited map[string]string, vendor bool) error {
369384
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+
371394
if _, ok := visited[name]; ok {
372395
continue
373396
}
@@ -378,7 +401,7 @@ func dependencies(pkg *build.Package, visited map[string]string) error {
378401
}
379402

380403
visited[name] = pkg.PkgObj
381-
if err := dependencies(next, visited); err != nil {
404+
if err := dependencies(next, visited, vendor); err != nil {
382405
return err
383406
}
384407
}

0 commit comments

Comments
 (0)