From 722f647346b025d30a15741e5787e53a4dcb91ea Mon Sep 17 00:00:00 2001 From: gedi Date: Fri, 9 Nov 2018 16:45:40 +0200 Subject: [PATCH] temporary patch for module support inside GOPATH --- builder_go110.go | 67 ++++++++++++++++++++++++++++++++----- builder_go111_test.go | 77 +++++++++++++++++++++---------------------- 2 files changed, 97 insertions(+), 47 deletions(-) diff --git a/builder_go110.go b/builder_go110.go index c124863..a661585 100644 --- a/builder_go110.go +++ b/builder_go110.go @@ -143,11 +143,15 @@ func Build(bin string) error { // godog library may not be imported in tested package // but we need it for our testmain package. - // So we look it up in available source paths - // including vendor directory, supported since 1.5. - godogPkg, err := locatePackage(godogImportPath) - if err != nil { - return err + godogPkg := locateModule(godogImportPath) + if godogPkg == nil { + // if it was not located as module + // we look it up in available source paths + // including vendor directory, supported since 1.5. + godogPkg, err = locatePackage(godogImportPath) + if err != nil { + return err + } } // make sure godog package archive is installed, gherkin @@ -444,10 +448,16 @@ func dependencies(pkg *build.Package, visited map[string]string, vendor bool) er if _, ok := visited[name]; ok { continue } - next, err := locatePackage(name) - if err != nil { - return err + + next := locateModule(name) // module takes priority + if next == nil { + var err error + next, err = locatePackage(name) + if err != nil { + return err + } } + visited[name] = pkg.PkgObj if err := dependencies(next, visited, vendor); err != nil { return err @@ -455,3 +465,44 @@ func dependencies(pkg *build.Package, visited map[string]string, vendor bool) er } return nil } + +func locateModule(name string) *build.Package { + // for module support, query the module import path + cmd := exec.Command("go", "mod", "download", "-json") + out, err := cmd.StdoutPipe() + if err != nil { + // Unable to read stdout + return nil + } + if cmd.Start() != nil { + // Does not using modules + return nil + } + + type module struct { + Dir string + Path string + } + + var mod *module + if err := json.NewDecoder(out).Decode(&mod); err != nil { + // Unexpected result + return nil + } + if cmd.Wait() != nil { + return nil + } + + if strings.Index(name, mod.Path) == -1 { + return nil + } + + suffix := strings.Replace(name, mod.Path, "", 1) + add := strings.Replace(suffix, "/", string(filepath.Separator), -1) + pkg, err := build.ImportDir(mod.Dir+add, 0) + if err != nil { + return nil + } + + return pkg +} diff --git a/builder_go111_test.go b/builder_go111_test.go index 0c16714..2394408 100644 --- a/builder_go111_test.go +++ b/builder_go111_test.go @@ -47,47 +47,46 @@ func TestGodogBuildWithModuleOutsideGopath(t *testing.T) { } } -// func TestGodogBuildWithModuleInsideGopath(t *testing.T) { -// gopath := filepath.Join(os.TempDir(), "_gp") -// dir := filepath.Join(gopath, "src", "godogs") -// err := buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) -// if err != nil { -// os.RemoveAll(gopath) -// t.Fatal(err) -// } -// defer os.RemoveAll(gopath) +func TestGodogBuildWithModuleInsideGopath(t *testing.T) { + gopath := filepath.Join(os.TempDir(), "_gp") + dir := filepath.Join(gopath, "src", "godogs") + err := buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) + if err != nil { + os.RemoveAll(gopath) + t.Fatal(err) + } + defer os.RemoveAll(gopath) -// prevDir, err := os.Getwd() -// if err != nil { -// t.Fatal(err) -// } + prevDir, err := os.Getwd() + if err != nil { + t.Fatal(err) + } -// if err := os.Chdir(dir); err != nil { -// t.Fatal(err) -// } -// defer os.Chdir(prevDir) + if err := os.Chdir(dir); err != nil { + t.Fatal(err) + } + defer os.Chdir(prevDir) -// c := exec.Command("go", "mod", "init", "godogs") -// c.Env = os.Environ() -// c.Env = append(c.Env, "GOPATH="+gopath) -// c.Env = append(c.Env, "GO111MODULE=on") -// if out, err := c.CombinedOutput(); err != nil { -// t.Log(string(out)) -// t.Fatal(err) -// } + c := exec.Command("go", "mod", "init", "godogs") + c.Env = os.Environ() + c.Env = append(c.Env, "GOPATH="+gopath) + c.Env = append(c.Env, "GO111MODULE=on") + if out, err := c.CombinedOutput(); err != nil { + t.Log(string(out)) + t.Fatal(err) + } -// var stdout, stderr bytes.Buffer -// cmd := exec.Command("godog", "godogs.feature") -// cmd.Stdout = &stdout -// cmd.Stderr = &stderr -// cmd.Env = os.Environ() -// cmd.Env = append(cmd.Env, "GOPATH="+gopath) -// cmd.Env = append(cmd.Env, "GO111MODULE=on") + var stdout, stderr bytes.Buffer + cmd := exec.Command("godog", "godogs.feature") + cmd.Stdout = &stdout + cmd.Stderr = &stderr + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, "GOPATH="+gopath) + cmd.Env = append(cmd.Env, "GO111MODULE=on") -// if err := cmd.Run(); err != nil { -// t.Log(stdout.String()) -// t.Log(stderr.String()) -// t.Fatal(err) -// } -// fmt.Println(stdout.String()) -// } + if err := cmd.Run(); err != nil { + t.Log(stdout.String()) + t.Log(stderr.String()) + t.Fatal(err) + } +}