Skip to content

Commit 3e06d5a

Browse files
author
Randall C. O'Reilly
committed
split up loading of package from parsing, only use the tools packages.Load and remove dependence on GOPATH GoSrcDir -- should now work exclusively with modules. also only build but don't install packages so go/bin doesn't get spammed
1 parent aa54942 commit 3e06d5a

File tree

9 files changed

+248
-93
lines changed

9 files changed

+248
-93
lines changed

bind/symbols.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,10 @@ func (sym *symtab) addSymbol(obj types.Object) error {
564564
}
565565

566566
case *types.TypeName:
567+
// tn := obj.(*types.TypeName)
568+
// if tn.IsAlias() {
569+
// fmt.Printf("type is an alias: %v\n", tn)
570+
// }
567571
return sym.addType(obj, obj.Type())
568572

569573
default:

cmd_build.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,17 @@ func gopyRunCmdBuild(cmdr *commander.Command, args []string) error {
6666
cmdstr := argStr()
6767

6868
for _, path := range args {
69-
pkg, err := newPackage(path)
69+
bpkg, err := loadPackage(path, true) // build first
7070
if err != nil {
71-
return fmt.Errorf("gopy-build: go/build.Import failed with path=%q: %v", path, err)
71+
return fmt.Errorf("gopy-gen: go build / load of package failed with path=%q: %v", path, err)
7272
}
73+
pkg, err := parsePackage(bpkg)
7374
if name == "" {
7475
name = pkg.Name()
7576
}
77+
if err != nil {
78+
return err
79+
}
7680
}
7781
return runBuild("build", odir, name, cmdstr, vm, mainstr, symbols)
7882
}

cmd_exe.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,17 +122,7 @@ func gopyRunCmdExe(cmdr *commander.Command, args []string) error {
122122
}
123123

124124
for _, path := range args {
125-
var rootdir string
126-
var err error
127-
if strings.HasPrefix(path, "./") {
128-
rootdir = path
129-
} else {
130-
rootdir, err = GoSrcDir(path)
131-
}
132-
if err != nil {
133-
return err
134-
}
135-
buildPkgRecurse(odir, path, rootdir, rootdir, exmap)
125+
buildPkgRecurse(odir, path, path, exmap)
136126
}
137127
return runBuild(bind.ModeExe, odir, name, cmdstr, vm, mainstr, symbols)
138128
}

cmd_gen.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,19 @@ func gopyRunCmdGen(cmdr *commander.Command, args []string) error {
6565
bind.NoMake = nomake
6666

6767
for _, path := range args {
68-
pkg, err := newPackage(path)
68+
bpkg, err := loadPackage(path, true) // build first
69+
if err != nil {
70+
return fmt.Errorf("gopy-gen: go build / load of package failed with path=%q: %v", path, err)
71+
}
72+
pkg, err := parsePackage(bpkg)
6973
if name == "" {
7074
name = pkg.Name()
7175
}
7276
if err != nil {
73-
return fmt.Errorf("gopy-gen: go/build.Import failed with path=%q: %v", path, err)
77+
return err
7478
}
7579
}
7680

77-
// false = library version
7881
err = genPkg(bind.ModeGen, odir, name, cmdstr, vm, mainstr)
7982
if err != nil {
8083
return err

cmd_pkg.go

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -120,44 +120,44 @@ func gopyRunCmdPkg(cmdr *commander.Command, args []string) error {
120120
}
121121

122122
for _, path := range args {
123-
var rootdir string
124-
var err error
125-
if strings.HasPrefix(path, "./") {
126-
rootdir = path
127-
} else {
128-
rootdir, err = GoSrcDir(path)
129-
}
130-
if err != nil {
131-
return err
132-
}
133-
buildPkgRecurse(odir, path, rootdir, rootdir, exmap)
123+
buildPkgRecurse(odir, path, path, exmap)
134124
}
135125
return runBuild(bind.ModePkg, odir, name, cmdstr, vm, mainstr, symbols)
136126
}
137127

138-
func buildPkgRecurse(odir, path, rootdir, pathdir string, exmap map[string]struct{}) {
139-
reldir, _ := filepath.Rel(rootdir, pathdir)
140-
gofiles := GoFiles(pathdir)
141-
// fmt.Printf("go files: %s\n", gofiles)
128+
func buildPkgRecurse(odir, path, rootpath string, exmap map[string]struct{}) error {
129+
buildFirst := path == rootpath
130+
bpkg, err := loadPackage(path, buildFirst)
131+
if err != nil {
132+
return fmt.Errorf("gopy-gen: go build / load of package failed with path=%q: %v", path, err)
133+
}
134+
gofiles := bpkg.GoFiles
142135
if len(gofiles) == 0 || (len(gofiles) == 1 && gofiles[0] == "doc.go") {
143-
fmt.Printf("\tskipping dir with no go files or only doc.go file: %s -- %s\n", pathdir, gofiles)
144-
} else {
145-
if reldir == "" {
146-
newPackage(path)
147-
} else {
148-
pkgpath := path + "/" + reldir
149-
newPackage(pkgpath)
136+
fmt.Printf("\tskipping dir with no go files or only doc.go file: %s -- %s\n", path, gofiles)
137+
if len(gofiles) == 0 {
138+
// fmt.Printf("otherfiles: %v\nignorefiles: %v\n", bpkg.OtherFiles, bpkg.IgnoredFiles)
139+
if len(bpkg.OtherFiles) > 0 {
140+
gofiles = bpkg.OtherFiles
141+
} else if len(bpkg.IgnoredFiles) > 0 {
142+
gofiles = bpkg.IgnoredFiles
143+
} else {
144+
return nil // done
145+
}
150146
}
147+
} else {
148+
parsePackage(bpkg)
151149
}
152150

153151
// now try all subdirs
154-
drs := Dirs(pathdir)
152+
dir, _ := filepath.Split(gofiles[0])
153+
drs := Dirs(dir)
155154
for _, dr := range drs {
156155
_, ex := exmap[dr]
157156
if ex || dr[0] == '.' || dr[0] == '_' {
158157
continue
159158
}
160-
sp := filepath.Join(pathdir, dr)
161-
buildPkgRecurse(odir, path, rootdir, sp, exmap)
159+
sp := filepath.Join(path, dr)
160+
buildPkgRecurse(odir, sp, rootpath, exmap)
162161
}
162+
return nil
163163
}

dirs.go

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,9 @@
55
package main
66

77
import (
8-
"fmt"
9-
"go/build"
108
"io/ioutil"
11-
"os"
12-
"path/filepath"
13-
"strings"
149
)
1510

16-
// GoSrcDir tries to locate dir in GOPATH/src/ or GOROOT/src/pkg/ and returns its
17-
// full path. GOPATH may contain a list of paths. From Robin Elkind github.com/mewkiz/pkg
18-
func GoSrcDir(dir string) (absDir string, err error) {
19-
for _, srcDir := range build.Default.SrcDirs() {
20-
absDir = filepath.Join(srcDir, dir)
21-
finfo, err := os.Stat(absDir)
22-
if err == nil && finfo.IsDir() {
23-
return absDir, nil
24-
}
25-
}
26-
return "", fmt.Errorf("GoSrcDir: unable to locate directory (%q) in GOPATH/src/ (%q) or GOROOT/src/pkg/ (%q)", dir, os.Getenv("GOPATH"), os.Getenv("GOROOT"))
27-
}
28-
2911
// Dirs returns a slice of all the directories within a given directory
3012
func Dirs(path string) []string {
3113
files, err := ioutil.ReadDir(path)
@@ -41,19 +23,3 @@ func Dirs(path string) []string {
4123
}
4224
return fnms
4325
}
44-
45-
// GoFiles returns a slice of all the go files within a given directory
46-
func GoFiles(path string) []string {
47-
files, err := ioutil.ReadDir(path)
48-
if err != nil {
49-
return nil
50-
}
51-
52-
var fnms []string
53-
for _, fi := range files {
54-
if !fi.IsDir() && strings.HasSuffix(fi.Name(), ".go") {
55-
fnms = append(fnms, fi.Name())
56-
}
57-
}
58-
return fnms
59-
}

gen.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -85,28 +85,30 @@ func genPkg(mode bind.BuildMode, odir, outname, cmdstr, vm, mainstr string) erro
8585
return err
8686
}
8787

88-
func newPackage(path string) (*bind.Package, error) {
88+
func loadPackage(path string, buildFirst bool) (*packages.Package, error) {
8989
cwd, err := os.Getwd()
9090
if err != nil {
9191
return nil, err
9292
}
9393

94-
cmd := exec.Command("go", "install", path)
95-
cmd.Stdin = os.Stdin
96-
cmd.Stdout = os.Stdout
97-
cmd.Stderr = os.Stderr
98-
cmd.Dir = cwd
94+
if buildFirst {
95+
cmd := exec.Command("go", "build", "-v", path)
96+
cmd.Stdin = os.Stdin
97+
cmd.Stdout = os.Stdout
98+
cmd.Stderr = os.Stderr
99+
cmd.Dir = cwd
99100

100-
err = cmd.Run()
101-
if err != nil {
102-
log.Printf("error installing [%s]: %v\n",
103-
path,
104-
err,
105-
)
106-
return nil, err
101+
err = cmd.Run()
102+
if err != nil {
103+
log.Printf("error building [%s]: %v\n",
104+
path,
105+
err,
106+
)
107+
return nil, err
108+
}
107109
}
108110

109-
// golang.org/x/tools/go/packages supports loading of std library packages too
111+
// golang.org/x/tools/go/packages supports modules or GOPATH etc
110112
bpkgs, err := packages.Load(&packages.Config{Mode: packages.LoadTypes}, path)
111113
if err != nil {
112114
log.Printf("error resolving import path [%s]: %v\n",
@@ -117,11 +119,15 @@ func newPackage(path string) (*bind.Package, error) {
117119
}
118120

119121
bpkg := bpkgs[0] // only ever have one at a time
122+
return bpkg, nil
123+
}
124+
125+
func parsePackage(bpkg *packages.Package) (*bind.Package, error) {
120126
dir, _ := filepath.Split(bpkg.GoFiles[0])
121127
p := bpkg.Types
122128

123129
if bpkg.Name == "main" {
124-
err = fmt.Errorf("gopy: skipping 'main' package %q", bpkg.PkgPath)
130+
err := fmt.Errorf("gopy: skipping 'main' package %q", bpkg.PkgPath)
125131
fmt.Println(err)
126132
return nil, err
127133
}

go.mod

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
module github.com/go-python/gopy
22

3-
go 1.12
3+
go 1.13
44

55
require (
6+
github.com/goki/gide v1.0.10 // indirect
67
github.com/gonuts/commander v0.1.0
78
github.com/gonuts/flag v0.1.0
8-
github.com/pkg/errors v0.8.1
9-
golang.org/x/tools v0.0.0-20200326194725-b1df9901287c
9+
github.com/pkg/errors v0.9.1
10+
golang.org/x/tools v0.0.0-20201123232213-4aa1a224cdb5
1011
)

0 commit comments

Comments
 (0)