pkger/parser/parser.go

183 lines
2.9 KiB
Go
Raw Normal View History

2019-08-01 19:03:12 +03:00
package parser
import (
2019-08-30 00:05:44 +03:00
"fmt"
2019-08-01 19:03:12 +03:00
"os"
"path/filepath"
"sort"
"strings"
2019-08-02 05:34:32 +03:00
"github.com/markbates/pkger"
2019-08-30 05:30:00 +03:00
"github.com/markbates/pkger/here"
2019-09-20 18:16:57 +03:00
"github.com/markbates/pkger/pkging"
2019-08-01 19:03:12 +03:00
)
var DefaultIgnoredFolders = []string{".", "_", "vendor", "node_modules", "_fixtures", "testdata"}
2019-09-21 19:51:29 +03:00
func Parse(her here.Info) (Results, error) {
2019-08-01 19:03:12 +03:00
var r Results
2019-08-02 00:56:37 +03:00
2019-09-21 19:51:29 +03:00
name := her.ImportPath
2019-08-02 00:56:37 +03:00
2019-08-02 05:34:32 +03:00
pt, err := pkger.Parse(name)
2019-08-01 19:03:12 +03:00
if err != nil {
return r, err
}
r.Path = pt
2019-09-20 18:16:57 +03:00
m := map[pkging.Path]bool{}
2019-08-02 00:56:37 +03:00
2019-08-01 21:37:01 +03:00
root := r.Path.Name
if !strings.HasPrefix(root, string(filepath.Separator)) {
root = string(filepath.Separator) + root
}
2019-08-02 00:56:37 +03:00
2019-08-01 21:37:01 +03:00
if !strings.HasPrefix(root, her.Dir) {
root = filepath.Join(her.Dir, root)
}
2019-08-02 00:56:37 +03:00
2019-08-01 19:03:12 +03:00
err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
base := filepath.Base(path)
for _, ig := range DefaultIgnoredFolders {
if strings.HasPrefix(base, ig) {
if info.IsDir() {
return filepath.SkipDir
}
return nil
}
}
if info.IsDir() {
2019-08-30 05:30:00 +03:00
if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil {
her, err = here.Dir(path)
if err != nil {
return err
}
}
n := fmt.Sprintf("%s:%s", her.ImportPath, strings.TrimPrefix(path, her.Dir))
pt, err := pkger.Parse(n)
2019-08-30 00:05:44 +03:00
if err != nil {
return err
2019-08-05 00:13:27 +03:00
}
2019-08-30 00:05:44 +03:00
2019-08-05 00:13:27 +03:00
m[pt] = true
2019-08-01 19:03:12 +03:00
return nil
}
ext := filepath.Ext(path)
if ext != ".go" {
return nil
}
2019-08-30 05:30:00 +03:00
v, err := newVisitor(path, her)
2019-08-01 19:03:12 +03:00
if err != nil {
return err
}
found, err := v.Run()
if err != nil {
return err
}
for _, p := range found {
2019-08-30 05:30:00 +03:00
if p.Pkg == "." {
p.Pkg = her.ImportPath
}
2019-08-01 19:03:12 +03:00
if _, ok := m[p]; ok {
continue
}
m[p] = true
found, err := sourceFiles(p)
if err != nil {
return err
}
for _, pf := range found {
pf.Pkg = p.Pkg
m[pf] = true
}
}
return nil
})
2019-09-20 18:16:57 +03:00
var found []pkging.Path
2019-08-01 19:03:12 +03:00
for k := range m {
if len(k.String()) == 0 {
continue
}
found = append(found, k)
}
sort.Slice(found, func(a, b int) bool {
return found[a].String() <= found[b].String()
})
r.Paths = found
return r, err
}
2019-09-20 18:16:57 +03:00
func sourceFiles(pt pkging.Path) ([]pkging.Path, error) {
var res []pkging.Path
2019-08-01 19:03:12 +03:00
2019-08-02 06:21:37 +03:00
her, err := pkger.Info(pt.Pkg)
2019-08-01 19:03:12 +03:00
if err != nil {
return res, err
}
2019-08-01 21:37:01 +03:00
fp := her.FilePath(pt.Name)
fi, err := os.Stat(fp)
if err != nil {
return res, err
}
if !fi.IsDir() {
return res, nil
}
2019-08-02 00:56:37 +03:00
2019-08-01 21:37:01 +03:00
err = filepath.Walk(fp, func(p string, info os.FileInfo, err error) error {
2019-08-01 19:03:12 +03:00
if err != nil {
return err
}
base := filepath.Base(p)
if base == "." {
return nil
}
for _, ig := range DefaultIgnoredFolders {
if strings.HasPrefix(base, ig) {
if info.IsDir() {
return filepath.SkipDir
}
return nil
}
}
if info.IsDir() {
return nil
}
2019-08-02 07:22:17 +03:00
n := strings.TrimPrefix(p, her.Dir)
2019-08-30 00:05:44 +03:00
n = strings.Replace(n, "\\", "/", -1)
2019-09-20 18:16:57 +03:00
pt := pkging.Path{
2019-08-01 19:03:12 +03:00
Name: n,
}
res = append(res, pt)
return nil
})
return res, err
}
type Results struct {
2019-09-20 18:16:57 +03:00
Paths []pkging.Path
Path pkging.Path
2019-08-01 19:03:12 +03:00
}