Skip to content

Commit

Permalink
adapts vendoring support for go1.10, should close #118
Browse files Browse the repository at this point in the history
  • Loading branch information
l3pp4rd committed Mar 8, 2018
1 parent f9aabcd commit 0371765
Showing 1 changed file with 65 additions and 42 deletions.
107 changes: 65 additions & 42 deletions builder_go110.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,26 +145,20 @@ func Build(bin string) error {
"-complete",
}

var in *os.File
cfg := filepath.Join(testdir, "importcfg.link")
args = append(args, "-importcfg", cfg)
if _, err := os.Stat(cfg); err == nil {
// there were go sources
in, err = os.OpenFile(cfg, os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
return err
}
} else {
if _, err := os.Stat(cfg); err != nil {
// there were no go sources in the directory
// so we need to build all dependency tree ourselves
in, err = os.Create(cfg)
in, err := os.Create(cfg)
if err != nil {
return err
}
fmt.Fprintln(in, "# import config")

deps := make(map[string]string)
if err := dependencies(godogPkg, deps); err != nil {
if err := dependencies(godogPkg, deps, false); err != nil {
in.Close()
return err
}

Expand All @@ -175,8 +169,30 @@ func Build(bin string) error {
}
fmt.Fprintf(in, "packagefile %s=%s\n", pkgName, pkgObj)
}
in.Close()
} else {
// need to make sure that vendor dependencies are mapped
in, err := os.OpenFile(cfg, os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
return err
}
deps := make(map[string]string)
if err := dependencies(pkg, deps, true); err != nil {
in.Close()
return err
}
if err := dependencies(godogPkg, deps, false); err != nil {
in.Close()
return err
}
for pkgName := range deps {
if i := strings.LastIndex(pkgName, "vendor/"); i != -1 {
name := pkgName[i+7:]
fmt.Fprintf(in, "importmap %s=%s\n", name, pkgName)
}
}
in.Close()
}
in.Close()

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

// in case if build is without contexts, need to remove import maps
if testdir == workdir {
data, err := ioutil.ReadFile(cfg)
if err != nil {
return err
}
data, err := ioutil.ReadFile(cfg)
if err != nil {
return err
}

lines := strings.Split(string(data), "\n")
var fixed []string
for _, line := range lines {
if strings.Index(line, "importmap") == 0 {
continue
}
fixed = append(fixed, line)
}
if err := ioutil.WriteFile(cfg, []byte(strings.Join(fixed, "\n")), 0600); err != nil {
return err
lines := strings.Split(string(data), "\n")
var fixed []string
for _, line := range lines {
if strings.Index(line, "importmap") == 0 {
continue
}
fixed = append(fixed, line)
}
if err := ioutil.WriteFile(cfg, []byte(strings.Join(fixed, "\n")), 0600); err != nil {
return err
}

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

func locatePackage(name string) (*build.Package, error) {
for _, p := range build.Default.SrcDirs() {
abs, err := filepath.Abs(filepath.Join(p, name))
if err != nil {
continue
}
pkg, err := build.ImportDir(abs, 0)
if err != nil {
continue
}
return pkg, nil
}

// search vendor paths
// search vendor paths first since that takes priority
dir, err := filepath.Abs(".")
if err != nil {
return nil, err
Expand All @@ -258,6 +260,19 @@ func locatePackage(name string) (*build.Package, error) {
}
}

// search source paths otherwise
for _, p := range build.Default.SrcDirs() {
abs, err := filepath.Abs(filepath.Join(p, name))
if err != nil {
continue
}
pkg, err := build.ImportDir(abs, 0)
if err != nil {
continue
}
return pkg, nil
}

return nil, fmt.Errorf("failed to find %s package in any of:\n%s", name, strings.Join(build.Default.SrcDirs(), "\n"))
}

Expand Down Expand Up @@ -365,9 +380,17 @@ func findToolDir() string {
return filepath.Clean(build.ToolDir)
}

func dependencies(pkg *build.Package, visited map[string]string) error {
func dependencies(pkg *build.Package, visited map[string]string, vendor bool) error {
visited[pkg.ImportPath] = pkg.PkgObj
for _, name := range pkg.Imports {
imports := pkg.Imports
if vendor {
imports = append(imports, pkg.TestImports...)
}
for _, name := range imports {
if i := strings.LastIndex(name, "vendor/"); vendor && i == -1 {
continue // only interested in vendor packages
}

if _, ok := visited[name]; ok {
continue
}
Expand All @@ -378,7 +401,7 @@ func dependencies(pkg *build.Package, visited map[string]string) error {
}

visited[name] = pkg.PkgObj
if err := dependencies(next, visited); err != nil {
if err := dependencies(next, visited, vendor); err != nil {
return err
}
}
Expand Down

0 comments on commit 0371765

Please sign in to comment.