adapts vendoring support for go1.10, should close #118
Этот коммит содержится в:
родитель
f9aabcdc58
коммит
0371765570
1 изменённых файлов: 65 добавлений и 42 удалений
|
@ -145,26 +145,20 @@ func Build(bin string) error {
|
||||||
"-complete",
|
"-complete",
|
||||||
}
|
}
|
||||||
|
|
||||||
var in *os.File
|
|
||||||
cfg := filepath.Join(testdir, "importcfg.link")
|
cfg := filepath.Join(testdir, "importcfg.link")
|
||||||
args = append(args, "-importcfg", cfg)
|
args = append(args, "-importcfg", cfg)
|
||||||
if _, err := os.Stat(cfg); err == nil {
|
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 {
|
|
||||||
// there were no go sources in the directory
|
// there were no go sources in the directory
|
||||||
// so we need to build all dependency tree ourselves
|
// so we need to build all dependency tree ourselves
|
||||||
in, err = os.Create(cfg)
|
in, err := os.Create(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Fprintln(in, "# import config")
|
fmt.Fprintln(in, "# import config")
|
||||||
|
|
||||||
deps := make(map[string]string)
|
deps := make(map[string]string)
|
||||||
if err := dependencies(godogPkg, deps); err != nil {
|
if err := dependencies(godogPkg, deps, false); err != nil {
|
||||||
|
in.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,8 +169,30 @@ func Build(bin string) error {
|
||||||
}
|
}
|
||||||
fmt.Fprintf(in, "packagefile %s=%s\n", pkgName, pkgObj)
|
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)
|
args = append(args, "-pack", testmain)
|
||||||
cmd = exec.Command(compiler, args...)
|
cmd = exec.Command(compiler, args...)
|
||||||
|
@ -197,7 +213,6 @@ func Build(bin string) error {
|
||||||
cmd.Env = os.Environ()
|
cmd.Env = os.Environ()
|
||||||
|
|
||||||
// in case if build is without contexts, need to remove import maps
|
// in case if build is without contexts, need to remove import maps
|
||||||
if testdir == workdir {
|
|
||||||
data, err := ioutil.ReadFile(cfg)
|
data, err := ioutil.ReadFile(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -214,7 +229,6 @@ func Build(bin string) error {
|
||||||
if err := ioutil.WriteFile(cfg, []byte(strings.Join(fixed, "\n")), 0600); err != nil {
|
if err := ioutil.WriteFile(cfg, []byte(strings.Join(fixed, "\n")), 0600); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
out, err = cmd.CombinedOutput()
|
out, err = cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -228,19 +242,7 @@ func Build(bin string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func locatePackage(name string) (*build.Package, error) {
|
func locatePackage(name string) (*build.Package, error) {
|
||||||
for _, p := range build.Default.SrcDirs() {
|
// search vendor paths first since that takes priority
|
||||||
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
|
|
||||||
dir, err := filepath.Abs(".")
|
dir, err := filepath.Abs(".")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -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"))
|
return nil, fmt.Errorf("failed to find %s package in any of:\n%s", name, strings.Join(build.Default.SrcDirs(), "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,9 +380,17 @@ func findToolDir() string {
|
||||||
return filepath.Clean(build.ToolDir)
|
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
|
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 {
|
if _, ok := visited[name]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -378,7 +401,7 @@ func dependencies(pkg *build.Package, visited map[string]string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
visited[name] = pkg.PkgObj
|
visited[name] = pkg.PkgObj
|
||||||
if err := dependencies(next, visited); err != nil {
|
if err := dependencies(next, visited, vendor); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче