diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 12956fd..108063a 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -1,4 +1,5 @@
variables:
+ GOPROXY: "https://proxy.golang.org"
GOBIN: "$(GOPATH)/bin" # Go binaries path
GOPATH: "$(system.defaultWorkingDirectory)/gopath" # Go workspace path
modulePath: "$(GOPATH)/src/github.com/$(build.repository.name)" # Path to the module"s code
@@ -9,12 +10,12 @@ jobs:
vmImage: "vs2017-win2016"
strategy:
matrix:
- go 1.11 (on):
- go_version: "1.11.13"
- GO111MODULE: "on"
go 1.12 (on):
go_version: "1.12.9"
GO111MODULE: "on"
+ go 1.13 (on):
+ go_version: "1.13"
+ GO111MODULE: "on"
steps:
- template: azure-tests.yml
@@ -23,12 +24,12 @@ jobs:
vmImage: "macOS-10.13"
strategy:
matrix:
- go 1.11 (on):
- go_version: "1.11.13"
- GO111MODULE: "on"
go 1.12 (on):
go_version: "1.12.9"
GO111MODULE: "on"
+ go 1.13 (on):
+ go_version: "1.13"
+ GO111MODULE: "on"
steps:
- template: azure-tests.yml
@@ -37,11 +38,11 @@ jobs:
vmImage: "ubuntu-16.04"
strategy:
matrix:
- go 1.11 (on):
- go_version: "1.11.13"
- GO111MODULE: "on"
go 1.12 (on):
go_version: "1.12.9"
GO111MODULE: "on"
+ go 1.13 (on):
+ go_version: "1.13"
+ GO111MODULE: "on"
steps:
- template: azure-tests.yml
diff --git a/cmd/pkger/info.go b/cmd/pkger/info.go
index 3a6f5ad..986695c 100644
--- a/cmd/pkger/info.go
+++ b/cmd/pkger/info.go
@@ -5,6 +5,7 @@ import (
"fmt"
"github.com/markbates/pkger"
+ "github.com/markbates/pkger/pkging"
)
type infoCmd struct {
@@ -44,12 +45,12 @@ func (f *infoCmd) Exec(args []string) error {
return err
}
for _, ff := range files {
- fmt.Println(pkger.NewFileInfo(ff))
+ fmt.Println(pkging.NewFileInfo(ff))
}
continue
}
- fmt.Println(pkger.NewFileInfo(fi))
+ fmt.Println(pkging.NewFileInfo(fi))
}
return nil
diff --git a/cmd/pkger/pack.go b/cmd/pkger/pack.go
index 652142a..b5a7e55 100644
--- a/cmd/pkger/pack.go
+++ b/cmd/pkger/pack.go
@@ -8,6 +8,7 @@ import (
"github.com/markbates/pkger"
"github.com/markbates/pkger/parser"
+ "github.com/markbates/pkger/pkging"
)
const outName = "pkged.go"
@@ -24,12 +25,12 @@ func (e *packCmd) Name() string {
}
func (e *packCmd) Exec(args []string) error {
- info, err := pkger.Stat()
+ info, err := pkger.Current()
if err != nil {
return err
}
- res, err := parser.Parse(info.Dir)
+ res, err := parser.Parse(info)
if err != nil {
return err
}
@@ -116,7 +117,7 @@ func (e *packCmd) Flags() *flag.FlagSet {
return e.FlagSet
}
-func Package(out string, paths []pkger.Path) error {
+func Package(out string, paths []pkging.Path) error {
os.RemoveAll(out)
f, err := os.Create(out)
@@ -124,7 +125,7 @@ func Package(out string, paths []pkger.Path) error {
return err
}
- c, err := pkger.Stat()
+ c, err := pkger.Current()
if err != nil {
return err
}
@@ -132,9 +133,10 @@ func Package(out string, paths []pkger.Path) error {
fmt.Fprintf(f, "import \"github.com/markbates/pkger\"\n\n")
fmt.Fprintf(f, "var _ = pkger.Unpack(`")
- if err := pkger.Pack(f, paths); err != nil {
- return err
- }
+ // TODO
+ // if err := pkger.Pack(f, paths); err != nil {
+ // return err
+ // }
fmt.Fprintf(f, "`)\n")
diff --git a/cmd/pkger/serve.go b/cmd/pkger/serve.go
index 474cc4f..f195e58 100644
--- a/cmd/pkger/serve.go
+++ b/cmd/pkger/serve.go
@@ -48,10 +48,11 @@ func (s *serveCmd) Exec(args []string) error {
return err
}
- ex := append(defaultExcludes, s.excludes...)
- if err := pkger.Exclude(f, ex...); err != nil {
- return err
- }
+ // TODO
+ // ex := append(defaultExcludes, s.excludes...)
+ // if err := pkger.Exclude(f, ex...); err != nil {
+ // return err
+ // }
defer f.Close()
fmt.Println(f.Path())
diff --git a/cmd/pkger/walk.go b/cmd/pkger/walk.go
index 59c642c..907f041 100644
--- a/cmd/pkger/walk.go
+++ b/cmd/pkger/walk.go
@@ -8,7 +8,10 @@ import (
)
func walk(args []string) error {
- err := pkger.Walk(".", func(path pkger.Path, info os.FileInfo) error {
+ err := pkger.Walk(".", func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
fmt.Println(path)
return nil
})
diff --git a/create.go b/create.go
deleted file mode 100644
index 2adae16..0000000
--- a/create.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package pkger
-
-import (
- "path/filepath"
- "time"
-)
-
-func Create(name string) (*File, error) {
- pt, err := Parse(name)
- if err != nil {
- return nil, err
- }
-
- her, err := Info(pt.Pkg)
- if err != nil {
- return nil, err
- }
- f := &File{
- path: pt,
- her: her,
- info: &FileInfo{
- name: pt.Name,
- mode: 0666,
- modTime: time.Now(),
- virtual: true,
- },
- }
-
- filesCache.Store(pt, f)
-
- dir := filepath.Dir(pt.Name)
- if err := MkdirAll(dir, 0644); err != nil {
- return nil, err
- }
- return f, nil
-}
diff --git a/create_test.go b/create_test.go
deleted file mode 100644
index f53b023..0000000
--- a/create_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package pkger
-
-import (
- "io"
- "os"
- "strings"
- "testing"
-
- "github.com/stretchr/testify/require"
-)
-
-func Test_Create(t *testing.T) {
- r := require.New(t)
-
- f, err := Create("/hello.txt")
- r.NoError(err)
- r.NotNil(f)
-
- fi, err := f.Stat()
- r.NoError(err)
-
- r.Equal("/hello.txt", fi.Name())
- r.Equal(os.FileMode(0666), fi.Mode())
- r.NotZero(fi.ModTime())
-
- her := f.her
- r.NotZero(her)
- r.Equal("github.com/markbates/pkger", her.ImportPath)
-}
-
-func Test_Create_Write(t *testing.T) {
- r := require.New(t)
-
- f, err := Create("/hello.txt")
- r.NoError(err)
- r.NotNil(f)
-
- fi, err := f.Stat()
- r.NoError(err)
- r.Zero(fi.Size())
-
- r.Equal("/hello.txt", fi.Name())
-
- mt := fi.ModTime()
- r.NotZero(mt)
-
- sz, err := io.Copy(f, strings.NewReader(radio))
- r.NoError(err)
- r.Equal(int64(1381), sz)
-
- r.NoError(f.Close())
- r.Equal(int64(1381), fi.Size())
- r.NotZero(fi.ModTime())
- r.NotEqual(mt, fi.ModTime())
-}
diff --git a/dir.go b/dir.go
deleted file mode 100644
index 750fb11..0000000
--- a/dir.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package pkger
-
-import (
- "os"
- "path/filepath"
- "time"
-)
-
-func MkdirAll(p string, perm os.FileMode) error {
- path, err := Parse(p)
- if err != nil {
- return err
- }
- root := path.Name
-
- cur, err := Stat()
- if err != nil {
- return err
- }
- for root != "" && root != "/" && root != "\\" {
- pt := Path{
- Pkg: path.Pkg,
- Name: root,
- }
- if _, ok := filesCache.Load(pt); ok {
- root = filepath.Dir(root)
- continue
- }
- f := &File{
- path: pt,
- her: cur,
- info: &FileInfo{
- name: pt.Name,
- mode: 0666,
- modTime: time.Now(),
- virtual: true,
- },
- }
-
- if err != nil {
- return err
- }
- f.info.isDir = true
- f.info.mode = perm
- f.info.virtual = true
- if err := f.Close(); err != nil {
- return err
- }
- filesCache.Store(pt, f)
- root = filepath.Dir(root)
- }
-
- return nil
-
-}
diff --git a/examples/app/go.sum b/examples/app/go.sum
index 1945221..499657f 100644
--- a/examples/app/go.sum
+++ b/examples/app/go.sum
@@ -1,5 +1,12 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -8,5 +15,7 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/file.go b/file.go
deleted file mode 100644
index a94bb18..0000000
--- a/file.go
+++ /dev/null
@@ -1,179 +0,0 @@
-package pkger
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io"
- "net/http"
- "os"
- "path/filepath"
- "regexp"
- "strings"
- "time"
-
- "github.com/markbates/pkger/here"
-)
-
-const timeFmt = time.RFC3339Nano
-
-var _ http.File = &File{}
-
-type File struct {
- info *FileInfo
- her here.Info
- path Path
- data []byte
- parent Path
- writer *bytes.Buffer
- reader io.Reader
- excludes []string
-}
-
-func (f *File) Seek(offset int64, whence int) (int64, error) {
- if sk, ok := f.reader.(io.Seeker); ok {
- return sk.Seek(offset, whence)
- }
- return 0, nil
-}
-
-func (f *File) Close() error {
- defer func() {
- f.reader = nil
- f.writer = nil
- }()
- if f.reader != nil {
- if c, ok := f.reader.(io.Closer); ok {
- if err := c.Close(); err != nil {
- return err
- }
- }
- }
-
- if f.writer == nil {
- return nil
- }
-
- f.data = f.writer.Bytes()
-
- fi := f.info
- fi.size = int64(len(f.data))
- fi.modTime = time.Now()
- f.info = fi
- return nil
-}
-
-func (f *File) Read(p []byte) (int, error) {
- if len(f.data) > 0 && f.reader == nil {
- f.reader = bytes.NewReader(f.data)
- }
-
- if f.reader != nil {
- return f.reader.Read(p)
- }
-
- of, err := f.her.Open(f.FilePath())
- if err != nil {
- return 0, err
- }
- f.reader = of
- return f.reader.Read(p)
-}
-
-func (f *File) Write(b []byte) (int, error) {
- if f.writer == nil {
- f.writer = &bytes.Buffer{}
- }
- i, err := f.writer.Write(b)
- return i, err
-}
-
-func (f File) Info() here.Info {
- return f.her
-}
-
-func (f File) Stat() (os.FileInfo, error) {
- if f.info == nil {
- return nil, os.ErrNotExist
- }
- return f.info, nil
-}
-
-func (f File) Name() string {
- return f.info.Name()
-}
-
-func (f File) FilePath() string {
- return f.her.FilePath(f.Name())
-}
-
-func (f File) Path() Path {
- return f.path
-}
-
-func (f File) String() string {
- return f.Path().String()
-}
-
-func (f File) Format(st fmt.State, verb rune) {
- switch verb {
- case 'v':
- if st.Flag('+') {
- b, err := json.MarshalIndent(f, "", " ")
- if err != nil {
- fmt.Fprint(os.Stderr, err)
- return
- }
- fmt.Fprint(st, string(b))
- return
- }
- fmt.Fprint(st, f.String())
- case 'q':
- fmt.Fprintf(st, "%q", f.String())
- default:
- fmt.Fprint(st, f.String())
- }
-}
-
-func (f *File) Readdir(count int) ([]os.FileInfo, error) {
- var infos []os.FileInfo
- err := Walk(f.Name(), func(pt Path, info os.FileInfo) error {
- if count > 0 && len(infos) == count {
- return io.EOF
- }
-
- for _, x := range f.excludes {
- rx, err := regexp.Compile(x)
- if err != nil {
- return err
- }
- if rx.MatchString(pt.Name) {
- if info.IsDir() {
- return filepath.SkipDir
- }
- return nil
- }
- }
-
- if pt.Name == f.parent.Name {
- return nil
- }
- if f.parent.Name != "/" {
- info = WithName(strings.TrimPrefix(info.Name(), f.parent.Name), info)
- }
- infos = append(infos, info)
- return nil
- })
-
- if err != nil {
- if _, ok := err.(*os.PathError); ok {
- return infos, nil
- }
- if err != io.EOF {
- return nil, err
- }
- }
-
- return infos, nil
-
-}
diff --git a/file_info.go b/file_info.go
deleted file mode 100644
index 5eb30b2..0000000
--- a/file_info.go
+++ /dev/null
@@ -1,139 +0,0 @@
-package pkger
-
-import (
- "encoding/json"
- "fmt"
- "os"
- "strings"
- "time"
-)
-
-type FileInfo struct {
- name string
- size int64
- mode os.FileMode
- modTime time.Time
- isDir bool
- virtual bool
- sys interface{}
-}
-
-func (f *FileInfo) String() string {
- b, _ := json.MarshalIndent(f, "", " ")
- return string(b)
-}
-
-func (f *FileInfo) MarshalJSON() ([]byte, error) {
- return json.Marshal(map[string]interface{}{
- "name": f.name,
- "size": f.size,
- "mode": f.mode,
- "modTime": f.modTime.Format(timeFmt),
- "isDir": f.isDir,
- "virtual": true,
- "sys": f.sys,
- })
-}
-
-func (f *FileInfo) UnmarshalJSON(b []byte) error {
- m := map[string]interface{}{}
- if err := json.Unmarshal(b, &m); err != nil {
- return err
- }
-
- var ok bool
-
- f.name, ok = m["name"].(string)
- if !ok {
- return fmt.Errorf("could not determine name %q", m["name"])
- }
-
- size, ok := m["size"].(float64)
- if !ok {
- return fmt.Errorf("could not determine size %q", m["size"])
- }
- f.size = int64(size)
-
- mode, ok := m["mode"].(float64)
- if !ok {
- return fmt.Errorf("could not determine mode %q", m["mode"])
- }
- f.mode = os.FileMode(mode)
-
- modTime, ok := m["modTime"].(string)
- if !ok {
- return fmt.Errorf("could not determine modTime %q", m["modTime"])
- }
- t, err := time.Parse(timeFmt, modTime)
- if err != nil {
- return err
- }
- f.modTime = t
-
- f.isDir, ok = m["isDir"].(bool)
- if !ok {
- return fmt.Errorf("could not determine isDir %q", m["isDir"])
- }
- f.sys = m["sys"]
- f.virtual = true
- return nil
-}
-
-func (f *FileInfo) Name() string {
- return f.name
-}
-
-func (f *FileInfo) Size() int64 {
- return f.size
-}
-
-func (f *FileInfo) Mode() os.FileMode {
- return f.mode
-}
-
-func (f *FileInfo) ModTime() time.Time {
- return f.modTime
-}
-
-func (f *FileInfo) IsDir() bool {
- return f.isDir
-}
-
-func (f *FileInfo) Sys() interface{} {
- return f.sys
-}
-
-var _ os.FileInfo = &FileInfo{}
-
-func NewFileInfo(info os.FileInfo) *FileInfo {
- fi := &FileInfo{
- name: cleanName(info.Name()),
- size: info.Size(),
- mode: info.Mode(),
- modTime: info.ModTime(),
- isDir: info.IsDir(),
- sys: info.Sys(),
- }
- return fi
-}
-
-func WithName(name string, info os.FileInfo) *FileInfo {
- if ft, ok := info.(*FileInfo); ok {
- ft.name = cleanName(name)
- return ft
- }
-
- fo := NewFileInfo(info)
- fo.name = cleanName(name)
- return fo
-}
-
-func cleanName(s string) string {
- if strings.Contains(s, "\\") {
- s = strings.Replace(s, "\\", "/", -1)
- }
- if !strings.HasPrefix(s, "/") {
- s = "/" + s
- }
- return s
-}
diff --git a/file_test.go b/file_test.go
deleted file mode 100644
index 03527e3..0000000
--- a/file_test.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package pkger
-
-import (
- "encoding/json"
- "io"
- "io/ioutil"
- "strings"
- "testing"
- "time"
-
- "github.com/stretchr/testify/require"
-)
-
-func Test_File_Open(t *testing.T) {
- r := require.New(t)
-
- f, err := Open("/file_test.go")
- r.NoError(err)
-
- r.Equal("/file_test.go", f.Name())
-
- b, err := ioutil.ReadAll(f)
- r.NoError(err)
- r.Contains(string(b), "Test_File_Open")
- r.NoError(f.Close())
-}
-
-func Test_File_Open_Dir(t *testing.T) {
- r := require.New(t)
-
- f, err := Open("/cmd")
- r.NoError(err)
-
- r.Equal("/cmd", f.Name())
-
- r.NoError(f.Close())
-}
-
-func Test_File_Read_Memory(t *testing.T) {
- r := require.New(t)
-
- f, err := Open("/file_test.go")
- r.NoError(err)
- f.data = []byte("hi!")
-
- r.Equal("/file_test.go", f.Name())
-
- b, err := ioutil.ReadAll(f)
- r.NoError(err)
- r.Equal(string(b), "hi!")
- r.NoError(f.Close())
-}
-
-func Test_File_Write(t *testing.T) {
- r := require.New(t)
-
- f, err := Create("/hello.txt")
- r.NoError(err)
- r.NotNil(f)
-
- fi, err := f.Stat()
- r.NoError(err)
- r.Zero(fi.Size())
-
- r.Equal("/hello.txt", fi.Name())
-
- mt := fi.ModTime()
- r.NotZero(mt)
-
- sz, err := io.Copy(f, strings.NewReader(radio))
- r.NoError(err)
- r.Equal(int64(1381), sz)
-
- // because windows can't handle the time precisely
- // enough, we have to *force* just a smidge of time
- // to ensure the two ModTime's are different.
- // i know, i hate it too.
- time.Sleep(time.Millisecond)
- r.NoError(f.Close())
- r.Equal(int64(1381), fi.Size())
- r.NotZero(fi.ModTime())
- r.NotEqual(mt, fi.ModTime())
-}
-
-func Test_File_JSON(t *testing.T) {
- r := require.New(t)
-
- f, err := createFile("/radio.radio")
- r.NoError(err)
- r.NotNil(f)
-
- bi, err := f.Stat()
- r.NoError(err)
-
- mj, err := json.Marshal(f)
- r.NoError(err)
-
- f2 := &File{}
-
- r.NoError(json.Unmarshal(mj, f2))
-
- ai, err := f2.Stat()
- r.NoError(err)
-
- r.Equal(bi.Size(), ai.Size())
-
- r.Equal(string(f.data), string(f2.data))
-}
diff --git a/files_map.go b/files_map.go
deleted file mode 100644
index 760a509..0000000
--- a/files_map.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT.
-
-package pkger
-
-import (
- "encoding/json"
- "fmt"
- "sort"
- "sync"
-)
-
-// filesMap wraps sync.Map and uses the following types:
-// key: Path
-// value: *File
-type filesMap struct {
- data *sync.Map
- once *sync.Once
-}
-
-func (m *filesMap) Data() *sync.Map {
- if m.once == nil {
- m.once = &sync.Once{}
- }
- m.once.Do(func() {
- if m.data == nil {
- m.data = &sync.Map{}
- }
- })
- return m.data
-}
-
-func (m *filesMap) MarshalJSON() ([]byte, error) {
- var err error
- mm := map[string]interface{}{}
- m.Data().Range(func(key, value interface{}) bool {
- var b []byte
- b, err = json.Marshal(key)
- if err != nil {
- return false
- }
- mm[string(b)] = value
- return true
- })
-
- if err != nil {
- return nil, err
- }
-
- return json.Marshal(mm)
-}
-
-func (m *filesMap) UnmarshalJSON(b []byte) error {
- mm := map[string]*File{}
-
- if err := json.Unmarshal(b, &mm); err != nil {
- return err
- }
- for k, v := range mm {
- var pt Path
- if err := json.Unmarshal([]byte(k), &pt); err != nil {
- return err
- }
- m.Store(pt, v)
- }
- return nil
-}
-
-// Delete the key from the map
-func (m *filesMap) Delete(key Path) {
- m.Data().Delete(key)
-}
-
-// Load the key from the map.
-// Returns *File or bool.
-// A false return indicates either the key was not found
-// or the value is not of type *File
-func (m *filesMap) Load(key Path) (*File, bool) {
- i, ok := m.Data().Load(key)
- if !ok {
- return nil, false
- }
- s, ok := i.(*File)
- return s, ok
-}
-
-// LoadOrStore will return an existing key or
-// store the value if not already in the map
-func (m *filesMap) LoadOrStore(key Path, value *File) (*File, bool) {
- i, _ := m.Data().LoadOrStore(key, value)
- s, ok := i.(*File)
- return s, ok
-}
-
-// LoadOr will return an existing key or
-// run the function and store the results
-func (m *filesMap) LoadOr(key Path, fn func(*filesMap) (*File, bool)) (*File, bool) {
- i, ok := m.Load(key)
- if ok {
- return i, ok
- }
- i, ok = fn(m)
- if ok {
- m.Store(key, i)
- return i, ok
- }
- return i, false
-}
-
-// Range over the *File values in the map
-func (m *filesMap) Range(f func(key Path, value *File) bool) {
- m.Data().Range(func(k, v interface{}) bool {
- key, ok := k.(Path)
- if !ok {
- return false
- }
- value, ok := v.(*File)
- if !ok {
- return false
- }
- return f(key, value)
- })
-}
-
-// Store a *File in the map
-func (m *filesMap) Store(key Path, value *File) {
- m.Data().Store(key, value)
-}
-
-// Keys returns a list of keys in the map
-func (m *filesMap) Keys() []Path {
- var keys []Path
- m.Range(func(key Path, value *File) bool {
- keys = append(keys, key)
- return true
- })
- sort.Slice(keys, func(a, b int) bool {
- return keys[a].String() <= keys[b].String()
- })
- return keys
-}
-
-func (m *filesMap) String() string {
- return fmt.Sprintf("%v", m.Keys())
-}
diff --git a/filter.go b/filter.go
deleted file mode 100644
index a32a8a0..0000000
--- a/filter.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package pkger
-
-func Exclude(fl *File, excludes ...string) error {
- fl.excludes = append(fl.excludes, excludes...)
- return nil
-}
diff --git a/go.mod b/go.mod
index 086da1b..74293c9 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,9 @@ module github.com/markbates/pkger
go 1.13
require (
+ github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/kr/pretty v0.1.0 // indirect
github.com/markbates/errx v1.1.0
github.com/stretchr/testify v1.4.0
+ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
)
diff --git a/go.sum b/go.sum
index fee900f..c6cc8bc 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,12 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI=
github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -9,5 +16,7 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/info.go b/info.go
deleted file mode 100644
index 4f52457..0000000
--- a/info.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package pkger
-
-import "github.com/markbates/pkger/here"
-
-func Info(p string) (here.Info, error) {
- info, ok := infosCache.Load(p)
- if ok {
- return info, nil
- }
-
- info, err := here.Package(p)
- if err != nil {
- return info, err
- }
- infosCache.Store(p, info)
- return info, nil
-}
diff --git a/infos_map.go b/infos_map.go
deleted file mode 100644
index ed5f886..0000000
--- a/infos_map.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Code generated by github.com/markbates/pkger/mapgen. DO NOT EDIT.
-
-package pkger
-
-import (
- "encoding/json"
- "fmt"
- "sort"
- "sync"
-
- "github.com/markbates/pkger/here"
-)
-
-// infosMap wraps sync.Map and uses the following types:
-// key: string
-// value: here.Info
-type infosMap struct {
- data *sync.Map
- once *sync.Once
-}
-
-func (m *infosMap) Data() *sync.Map {
- if m.once == nil {
- m.once = &sync.Once{}
- }
- m.once.Do(func() {
- if m.data == nil {
- m.data = &sync.Map{}
- }
- })
- return m.data
-}
-
-func (m *infosMap) MarshalJSON() ([]byte, error) {
- mm := map[string]interface{}{}
- m.data.Range(func(key, value interface{}) bool {
- mm[fmt.Sprintf("%s", key)] = value
- return true
- })
- return json.Marshal(mm)
-}
-
-func (m *infosMap) UnmarshalJSON(b []byte) error {
- mm := map[string]here.Info{}
-
- if err := json.Unmarshal(b, &mm); err != nil {
- return err
- }
- for k, v := range mm {
- m.Store(k, v)
- }
- return nil
-}
-
-// Delete the key from the map
-func (m *infosMap) Delete(key string) {
- m.Data().Delete(key)
-}
-
-// Load the key from the map.
-// Returns here.Info or bool.
-// A false return indicates either the key was not found
-// or the value is not of type here.Info
-func (m *infosMap) Load(key string) (here.Info, bool) {
- m.Data()
- i, ok := m.data.Load(key)
- if !ok {
- return here.Info{}, false
- }
- s, ok := i.(here.Info)
- return s, ok
-}
-
-// LoadOrStore will return an existing key or
-// store the value if not already in the map
-func (m *infosMap) LoadOrStore(key string, value here.Info) (here.Info, bool) {
- i, _ := m.Data().LoadOrStore(key, value)
- s, ok := i.(here.Info)
- return s, ok
-}
-
-// LoadOr will return an existing key or
-// run the function and store the results
-func (m *infosMap) LoadOr(key string, fn func(*infosMap) (here.Info, bool)) (here.Info, bool) {
- i, ok := m.Load(key)
- if ok {
- return i, ok
- }
- i, ok = fn(m)
- if ok {
- m.Store(key, i)
- return i, ok
- }
- return i, false
-}
-
-// Range over the here.Info values in the map
-func (m *infosMap) Range(f func(key string, value here.Info) bool) {
- m.Data().Range(func(k, v interface{}) bool {
- key, ok := k.(string)
- if !ok {
- return false
- }
- value, ok := v.(here.Info)
- if !ok {
- return false
- }
- return f(key, value)
- })
-}
-
-// Store a here.Info in the map
-func (m *infosMap) Store(key string, value here.Info) {
- m.Data().Store(key, value)
-}
-
-// Keys returns a list of keys in the map
-func (m *infosMap) Keys() []string {
- var keys []string
- m.Range(func(key string, value here.Info) bool {
- keys = append(keys, key)
- return true
- })
- sort.Strings(keys)
- return keys
-}
diff --git a/json.go b/json.go
deleted file mode 100644
index 1b3a07e..0000000
--- a/json.go
+++ /dev/null
@@ -1,83 +0,0 @@
-package pkger
-
-import (
- "encoding/json"
- "fmt"
- "io/ioutil"
-
- "github.com/markbates/pkger/here"
-)
-
-type jason struct {
- Files *filesMap `json:"files"`
- Infos *infosMap `json:"infos"`
- Paths *pathsMap `json:"paths"`
- CurrentInfo here.Info `json:"current_info"`
-}
-
-func (f File) MarshalJSON() ([]byte, error) {
- m := map[string]interface{}{}
- m["info"] = f.info
- m["her"] = f.her
- m["path"] = f.path
- m["data"] = f.data
- m["parent"] = f.parent
- if !f.info.virtual {
- if len(f.data) == 0 && !f.info.IsDir() {
- b, err := ioutil.ReadAll(&f)
- if err != nil {
- return nil, err
- }
- m["data"] = b
- }
- }
-
- return json.Marshal(m)
-}
-
-func (f *File) UnmarshalJSON(b []byte) error {
- m := map[string]json.RawMessage{}
- if err := json.Unmarshal(b, &m); err != nil {
- return err
- }
-
- info, ok := m["info"]
- if !ok {
- return fmt.Errorf("missing info")
- }
-
- f.info = &FileInfo{}
- if err := json.Unmarshal(info, f.info); err != nil {
- return err
- }
-
- her, ok := m["her"]
- if !ok {
- return fmt.Errorf("missing her")
- }
- if err := json.Unmarshal(her, &f.her); err != nil {
- return err
- }
-
- path, ok := m["path"]
- if !ok {
- return fmt.Errorf("missing path")
- }
- if err := json.Unmarshal(path, &f.path); err != nil {
- return err
- }
-
- parent, ok := m["parent"]
- if !ok {
- return fmt.Errorf("missing parent")
- }
- if err := json.Unmarshal(parent, &f.parent); err != nil {
- return err
- }
-
- if err := json.Unmarshal(m["data"], &f.data); err != nil {
- return err
- }
-
- return nil
-}
diff --git a/open.go b/open.go
deleted file mode 100644
index bc2b10d..0000000
--- a/open.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package pkger
-
-import (
- "net/http"
- "os"
- "path"
- "path/filepath"
- "strings"
-)
-
-func (f *File) Open(name string) (http.File, error) {
- pt, err := Parse(name)
- if err != nil {
- return nil, err
- }
-
- if pt == f.path {
- return f, nil
- }
-
- pt.Name = path.Join(f.Path().Name, pt.Name)
-
- di, err := Open(pt.String())
- if err != nil {
- return nil, err
- }
-
- fi, err := di.Stat()
- if err != nil {
- return nil, err
- }
- if fi.IsDir() {
- di.parent = f.path
- di.excludes = f.excludes
- }
- return di, nil
-}
-
-func Open(name string) (*File, error) {
- pt, err := Parse(name)
- if err != nil {
- return nil, err
- }
-
- f, ok := filesCache.Load(pt)
- if !ok {
- return openDisk(pt)
- }
- nf := &File{
- info: WithName(f.info.Name(), f.info),
- path: f.path,
- data: f.data,
- her: f.her,
- }
-
- return nf, nil
-}
-
-func openDisk(pt Path) (*File, error) {
- info, err := Info(pt.Pkg)
- if err != nil {
- return nil, err
- }
- fp := info.Dir
- if len(pt.Name) > 0 {
- fp = filepath.Join(fp, pt.Name)
- }
-
- fi, err := os.Stat(fp)
- if err != nil {
- return nil, err
- }
- f := &File{
- info: WithName(strings.TrimPrefix(pt.Name, "/"), NewFileInfo(fi)),
- her: info,
- path: pt,
- }
- return f, nil
-}
diff --git a/open_test.go b/open_test.go
deleted file mode 100644
index 82545f2..0000000
--- a/open_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-package pkger
-
-// func Test_Open_File(t *testing.T) {
-// r := require.New(t)
-//
-// f, err := Open(".")
-// r.NoError(err)
-//
-// ts := httptest.NewServer(http.FileServer(f))
-// defer ts.Close()
-//
-// res, err := http.Get(ts.URL + "/cmd/pkger/main.go")
-// r.NoError(err)
-// r.Equal(200, res.StatusCode)
-//
-// b, err := ioutil.ReadAll(res.Body)
-// r.NoError(err)
-// r.Contains(string(b), "does not compute")
-//
-// r.NoError(f.Close())
-// }
-//
-// func Test_Open_Dir(t *testing.T) {
-// r := require.New(t)
-//
-// f, err := Open("/")
-// r.NoError(err)
-//
-// ts := httptest.NewServer(http.FileServer(f))
-// defer ts.Close()
-//
-// res, err := http.Get(ts.URL + "/cmd/pkger")
-// r.NoError(err)
-// r.Equal(200, res.StatusCode)
-//
-// b, err := ioutil.ReadAll(res.Body)
-// r.NoError(err)
-// r.Contains(string(b), `/cmd/pkger/main.go`)
-//
-// r.NoError(f.Close())
-// }
-//
-// func Test_Open_File_Memory(t *testing.T) {
-// r := require.New(t)
-//
-// f, err := Create("/suit/case.txt")
-// r.NoError(err)
-// f.Write([]byte(radio))
-// r.NoError(f.Close())
-//
-// r.Equal([]byte(radio), f.data)
-// r.Contains(string(f.data), "I wanna bite the hand that feeds me")
-//
-// dir, err := Open("/")
-// r.NoError(err)
-// defer dir.Close()
-//
-// ts := httptest.NewServer(http.FileServer(dir))
-// defer ts.Close()
-//
-// res, err := http.Get(ts.URL + "/suit/case.txt")
-// r.NoError(err)
-// r.Equal(200, res.StatusCode)
-//
-// b, _ := ioutil.ReadAll(res.Body)
-// // r.NoError(err)
-// r.Contains(string(b), "I wanna bite the hand that feeds me")
-//
-// }
-//
-// func Test_Open_Dir_StripPrefix(t *testing.T) {
-// r := require.New(t)
-//
-// ts := httptest.NewServer(http.StripPrefix("/assets/", http.FileServer(http.Dir("./testdata/public"))))
-// defer ts.Close()
-//
-// res, err := http.Get(ts.URL + "/assets/radio.radio")
-// r.NoError(err)
-// r.Equal(200, res.StatusCode)
-//
-// b, _ := ioutil.ReadAll(res.Body)
-// // r.NoError(err)
-// r.Contains(string(b), "I wanna bite the hand that feeds me")
-//
-// res, err = http.Get(ts.URL + "/assets/")
-// r.NoError(err)
-// r.Equal(200, res.StatusCode)
-//
-// b, _ = ioutil.ReadAll(res.Body)
-// // r.NoError(err)
-// r.Contains(string(b), `radio.radio`)
-// }
-//
-// func Test_Open_Dir_Memory_StripPrefix(t *testing.T) {
-// r := require.New(t)
-//
-// err := MkdirAll("/testdata/public", 0755)
-// r.NoError(err)
-//
-// dir, err := Open("/testdata/public")
-// r.NoError(err)
-// defer dir.Close()
-//
-// ts := httptest.NewServer(http.StripPrefix("/assets/", http.FileServer(dir)))
-// defer ts.Close()
-//
-// res, err := http.Get(ts.URL + "/assets/radio.radio")
-// r.NoError(err)
-// r.Equal(200, res.StatusCode)
-//
-// b, _ := ioutil.ReadAll(res.Body)
-// // r.NoError(err)
-// r.Contains(string(b), "I wanna bite the hand that feeds me")
-//
-// res, err = http.Get(ts.URL + "/assets/")
-// r.NoError(err)
-// r.Equal(200, res.StatusCode)
-//
-// b, _ = ioutil.ReadAll(res.Body)
-// // r.NoError(err)
-// r.Contains(string(b), `/radio.radio`)
-// r.NotContains(string(b), `/public`)
-// r.NotContains(string(b), `//`)
-// }
diff --git a/parser/parser.go b/parser/parser.go
index 3d85c94..7509fdf 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -9,20 +9,15 @@ import (
"github.com/markbates/pkger"
"github.com/markbates/pkger/here"
+ "github.com/markbates/pkger/pkging"
)
var DefaultIgnoredFolders = []string{".", "_", "vendor", "node_modules", "_fixtures", "testdata"}
-func Parse(name string) (Results, error) {
+func Parse(cur here.Info) (Results, error) {
var r Results
- c, err := pkger.Stat()
- if err != nil {
- return r, err
- }
- if name == "" {
- name = c.ImportPath
- }
+ name := cur.ImportPath
pt, err := pkger.Parse(name)
if err != nil {
@@ -36,7 +31,7 @@ func Parse(name string) (Results, error) {
return r, err
}
- m := map[pkger.Path]bool{}
+ m := map[pkging.Path]bool{}
root := r.Path.Name
if !strings.HasPrefix(root, string(filepath.Separator)) {
@@ -117,7 +112,7 @@ func Parse(name string) (Results, error) {
return nil
})
- var found []pkger.Path
+ var found []pkging.Path
for k := range m {
if len(k.String()) == 0 {
@@ -133,8 +128,8 @@ func Parse(name string) (Results, error) {
return r, err
}
-func sourceFiles(pt pkger.Path) ([]pkger.Path, error) {
- var res []pkger.Path
+func sourceFiles(pt pkging.Path) ([]pkging.Path, error) {
+ var res []pkging.Path
her, err := pkger.Info(pt.Pkg)
@@ -177,7 +172,7 @@ func sourceFiles(pt pkger.Path) ([]pkger.Path, error) {
n := strings.TrimPrefix(p, her.Dir)
n = strings.Replace(n, "\\", "/", -1)
- pt := pkger.Path{
+ pt := pkging.Path{
Name: n,
}
res = append(res, pt)
@@ -188,6 +183,6 @@ func sourceFiles(pt pkger.Path) ([]pkger.Path, error) {
}
type Results struct {
- Paths []pkger.Path
- Path pkger.Path
+ Paths []pkging.Path
+ Path pkging.Path
}
diff --git a/parser/parser_test.go b/parser/parser_test.go
index 116d19a..5946b89 100644
--- a/parser/parser_test.go
+++ b/parser/parser_test.go
@@ -1,22 +1,23 @@
package parser
import (
- "os"
"path/filepath"
"sort"
"testing"
+ "github.com/markbates/pkger/here"
"github.com/stretchr/testify/require"
)
func Test_Parser(t *testing.T) {
r := require.New(t)
- pwd, err := os.Getwd()
- r.NoError(err)
- r.NoError(os.Chdir(filepath.Join("..", "examples", "app")))
- defer os.Chdir(pwd)
- res, err := Parse("")
+ ch := filepath.Join("..", "examples", "app")
+ info := here.Info{
+ Dir: ch,
+ ImportPath: "github.com/markbates/pkger/examples/app",
+ }
+ res, err := Parse(info)
r.NoError(err)
diff --git a/parser/visitor.go b/parser/visitor.go
index 8d8a083..a7645cb 100644
--- a/parser/visitor.go
+++ b/parser/visitor.go
@@ -8,11 +8,12 @@ import (
"github.com/markbates/pkger"
"github.com/markbates/pkger/here"
+ "github.com/markbates/pkger/pkging"
)
type visitor struct {
File string
- Found map[pkger.Path]bool
+ Found map[pkging.Path]bool
info here.Info
errors []error
}
@@ -20,12 +21,12 @@ type visitor struct {
func newVisitor(p string, info here.Info) (*visitor, error) {
return &visitor{
File: p,
- Found: map[pkger.Path]bool{},
+ Found: map[pkging.Path]bool{},
info: info,
}, nil
}
-func (v *visitor) Run() ([]pkger.Path, error) {
+func (v *visitor) Run() ([]pkging.Path, error) {
pf, err := parseFile(v.File)
if err != nil {
return nil, fmt.Errorf("%s: %v", v.File, err)
@@ -33,7 +34,7 @@ func (v *visitor) Run() ([]pkger.Path, error) {
ast.Walk(v, pf.Ast)
- var found []pkger.Path
+ var found []pkging.Path
for k := range v.Found {
found = append(found, k)
diff --git a/path.go b/path.go
deleted file mode 100644
index 47cc7f0..0000000
--- a/path.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package pkger
-
-import (
- "encoding/json"
- "fmt"
- "os"
- "regexp"
- "strings"
-)
-
-type Path struct {
- Pkg string `json:"pkg"`
- Name string `json:"name"`
-}
-
-func Parse(p string) (Path, error) {
- p = strings.Replace(p, "\\", "/", -1)
- pt, ok := pathsCache.Load(p)
- if ok {
- return pt, nil
- }
- if len(p) == 0 {
- return build(p, "", "")
- }
-
- res := pathrx.FindAllStringSubmatch(p, -1)
- if len(res) == 0 {
- return pt, fmt.Errorf("could not parse %q", p)
- }
-
- matches := res[0]
-
- if len(matches) != 4 {
- return pt, fmt.Errorf("could not parse %q", p)
- }
-
- return build(p, matches[1], matches[3])
-}
-
-func (p Path) String() string {
- if p.Name == "" {
- p.Name = "/"
- }
- return fmt.Sprintf("%s:%s", p.Pkg, p.Name)
-}
-
-func (p Path) Format(st fmt.State, verb rune) {
- switch verb {
- case 'v':
- if st.Flag('+') {
- b, err := json.MarshalIndent(p, "", " ")
- if err != nil {
- fmt.Fprint(os.Stderr, err)
- return
- }
- fmt.Fprint(st, string(b))
- return
- }
- fmt.Fprint(st, p.String())
- case 'q':
- fmt.Fprintf(st, "%q", p.String())
- default:
- fmt.Fprint(st, p.String())
- }
-}
-
-var pathrx = regexp.MustCompile("([^:]+)(:(/.+))?")
-
-func build(p, pkg, name string) (Path, error) {
- pt := Path{
- Pkg: pkg,
- Name: name,
- }
-
- current, err := Stat()
- if err != nil {
- return pt, err
- }
-
- if strings.HasPrefix(pt.Pkg, "/") || len(pt.Pkg) == 0 {
- pt.Name = pt.Pkg
- pt.Pkg = current.ImportPath
- }
-
- if len(pt.Name) == 0 {
- pt.Name = "/"
- }
-
- if pt.Pkg == pt.Name {
- pt.Pkg = current.ImportPath
- pt.Name = "/"
- }
-
- if !strings.HasPrefix(pt.Name, "/") {
- pt.Name = "/" + pt.Name
- }
- pathsCache.Store(p, pt)
- return pt, nil
-}
diff --git a/path_test.go b/path_test.go
deleted file mode 100644
index 5366177..0000000
--- a/path_test.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package pkger
-
-import (
- "testing"
-
- "github.com/stretchr/testify/require"
-)
-
-func Test_Path_String(t *testing.T) {
- table := []struct {
- in Path
- out string
- }{
- {in: Path{}, out: ":/"},
- {in: Path{Pkg: curPkg}, out: curPkg + ":/"},
- {in: Path{Pkg: curPkg, Name: "/foo.go"}, out: curPkg + ":/foo.go"},
- {in: Path{Name: "/foo.go"}, out: ":/foo.go"},
- {in: Path{Pkg: "github.com/markbates/pkger/internal/examples/app"}, out: "github.com/markbates/pkger/internal/examples/app:/"},
- }
-
- for _, tt := range table {
- t.Run(tt.in.String(), func(st *testing.T) {
- r := require.New(st)
- r.Equal(tt.out, tt.in.String())
- })
- }
-}
-func Test_Parse(t *testing.T) {
- table := []struct {
- in string
- out Path
- }{
- {in: curPkg, out: Path{Pkg: curPkg, Name: "/"}},
- {in: curPkg + ":/foo.go", out: Path{Pkg: curPkg, Name: "/foo.go"}},
- {in: "/paths/parse_test.go", out: Path{Pkg: curPkg, Name: "/paths/parse_test.go"}},
- {in: `\windows\path.go`, out: Path{Pkg: curPkg, Name: "/windows/path.go"}},
- {in: "", out: Path{Pkg: curPkg, Name: "/"}},
- {in: "github.com/markbates/pkger/internal/examples/app", out: Path{Pkg: "github.com/markbates/pkger/internal/examples/app", Name: "/"}},
- }
-
- for _, tt := range table {
- t.Run(tt.in, func(st *testing.T) {
- r := require.New(st)
-
- pt, err := Parse(tt.in)
- r.NoError(err)
-
- r.Equal(tt.out.Pkg, pt.Pkg)
- r.Equal(tt.out.Name, pt.Name)
- })
- }
-}
diff --git a/paths_map.go b/paths_map.go
deleted file mode 100644
index e0fcb0f..0000000
--- a/paths_map.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT.
-
-package pkger
-
-import (
- "encoding/json"
- "fmt"
- "sort"
- "sync"
-)
-
-// pathsMap wraps sync.Map and uses the following types:
-// key: string
-// value: Path
-type pathsMap struct {
- data *sync.Map
- once *sync.Once
-}
-
-func (m *pathsMap) Data() *sync.Map {
- if m.once == nil {
- m.once = &sync.Once{}
- }
- m.once.Do(func() {
- if m.data == nil {
- m.data = &sync.Map{}
- }
- })
- return m.data
-}
-
-func (m *pathsMap) MarshalJSON() ([]byte, error) {
- mm := map[string]interface{}{}
- m.Data().Range(func(key, value interface{}) bool {
- mm[fmt.Sprintf("%s", key)] = value
- return true
- })
- return json.Marshal(mm)
-}
-
-func (m *pathsMap) UnmarshalJSON(b []byte) error {
- mm := map[string]Path{}
-
- if err := json.Unmarshal(b, &mm); err != nil {
- return err
- }
- for k, v := range mm {
- m.Store(k, v)
- }
- return nil
-}
-
-// Delete the key from the map
-func (m *pathsMap) Delete(key string) {
- m.Data().Delete(key)
-}
-
-// Load the key from the map.
-// Returns Path or bool.
-// A false return indicates either the key was not found
-// or the value is not of type Path
-func (m *pathsMap) Load(key string) (Path, bool) {
- i, ok := m.Data().Load(key)
- if !ok {
- return Path{}, false
- }
- s, ok := i.(Path)
- return s, ok
-}
-
-// LoadOrStore will return an existing key or
-// store the value if not already in the map
-func (m *pathsMap) LoadOrStore(key string, value Path) (Path, bool) {
- i, _ := m.Data().LoadOrStore(key, value)
- s, ok := i.(Path)
- return s, ok
-}
-
-// LoadOr will return an existing key or
-// run the function and store the results
-func (m *pathsMap) LoadOr(key string, fn func(*pathsMap) (Path, bool)) (Path, bool) {
- i, ok := m.Load(key)
- if ok {
- return i, ok
- }
- i, ok = fn(m)
- if ok {
- m.Store(key, i)
- return i, ok
- }
- return i, false
-}
-
-// Range over the Path values in the map
-func (m *pathsMap) Range(f func(key string, value Path) bool) {
- m.Data().Range(func(k, v interface{}) bool {
- key, ok := k.(string)
- if !ok {
- return false
- }
- value, ok := v.(Path)
- if !ok {
- return false
- }
- return f(key, value)
- })
-}
-
-// Store a Path in the map
-func (m *pathsMap) Store(key string, value Path) {
- m.Data().Store(key, value)
-}
-
-// Keys returns a list of keys in the map
-func (m *pathsMap) Keys() []string {
- var keys []string
- m.Range(func(key string, value Path) bool {
- keys = append(keys, key)
- return true
- })
- sort.Strings(keys)
- return keys
-}
diff --git a/pkger.go b/pkger.go
index 58a69d2..326e3ac 100644
--- a/pkger.go
+++ b/pkger.go
@@ -1,117 +1,29 @@
package pkger
import (
- "bytes"
- "compress/gzip"
- "encoding/hex"
- "encoding/json"
- "fmt"
- "io"
- "io/ioutil"
"log"
- "sync"
- "github.com/markbates/pkger/here"
+ "github.com/markbates/pkger/pkging"
+ "github.com/markbates/pkger/pkging/stdos"
)
-var filesCache = &filesMap{}
-var infosCache = &infosMap{}
-var pathsCache = &pathsMap{}
-var curOnce = &sync.Once{}
-var currentInfo here.Info
-
-var packed bool
-
-var packMU = &sync.RWMutex{}
-
-func ReadFile(s string) ([]byte, error) {
- f, err := Open(s)
+var current = func() pkging.Pkger {
+ n, err := stdos.New()
if err != nil {
- return nil, err
+ log.Fatal(err)
}
- defer f.Close()
- return ioutil.ReadAll(f)
-}
+ return n
+}()
-func Unpack(ind string) error {
- packed = true
- packMU.Lock()
- defer packMU.Unlock()
- b, err := hex.DecodeString(ind)
- if err != nil {
- log.Fatal("hex.DecodeString", err)
- return err
- }
-
- gz, err := gzip.NewReader(bytes.NewReader(b))
- if err != nil {
- log.Fatal("gzip.NewReader", err)
- return err
- }
- defer gz.Close()
-
- var jay jason
- if err := json.NewDecoder(gz).Decode(&jay); err != nil {
- return err
- }
- jay.Files.Range(func(key Path, value *File) bool {
- filesCache.Store(key, value)
- return true
- })
- jay.Infos.Range(func(key string, value here.Info) bool {
- infosCache.Store(key, value)
- return true
- })
- jay.Paths.Range(func(key string, value Path) bool {
- pathsCache.Store(key, value)
- return true
- })
- currentInfo = jay.CurrentInfo
- return nil
-}
-
-func Pack(out io.Writer, paths []Path) error {
- packMU.RLock()
- defer packMU.RUnlock()
- bb := &bytes.Buffer{}
- gz := gzip.NewWriter(bb)
- defer gz.Close()
-
- for _, p := range paths {
- f, err := Open(p.String())
- if err != nil {
- return err
- }
-
- fi, err := f.Stat()
- if err != nil {
- return err
- }
- if fi.IsDir() {
- filesCache.Store(p, f)
- f.Close()
- continue
- }
-
- filesCache.Store(p, f)
- f.Close()
-
- }
-
- jay := jason{
- Files: filesCache,
- Infos: infosCache,
- Paths: pathsCache,
- CurrentInfo: currentInfo,
- }
-
- if err := json.NewEncoder(gz).Encode(jay); err != nil {
- return err
- }
- if err := gz.Close(); err != nil {
- return err
- }
- s := hex.EncodeToString(bb.Bytes())
- _, err := fmt.Fprint(out, s)
- return err
-}
+var Abs = current.Abs
+var AbsPath = current.AbsPath
+var Create = current.Create
+var Current = current.Current
+var Info = current.Info
+var MkdirAll = current.MkdirAll
+var Open = current.Open
+var Parse = current.Parse
+var Remove = current.Remove
+var RemoveAll = current.RemoveAll
+var Stat = current.Stat
+var Walk = current.Walk
diff --git a/pkger_test.go b/pkger_test.go
deleted file mode 100644
index aa6c240..0000000
--- a/pkger_test.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package pkger
-
-import (
- "io"
- "strings"
- "testing"
-
- "github.com/stretchr/testify/require"
-)
-
-const curPkg = "github.com/markbates/pkger"
-
-func Test_ReadFile(t *testing.T) {
- r := require.New(t)
- b, err := ReadFile("/LICENSE")
- r.NoError(err)
- r.Contains(string(b), "MIT")
-}
-
-func createFile(p string, body ...string) (*File, error) {
- if len(body) == 0 {
- body = append(body, radio)
- }
-
- f, err := Create(p)
- if err != nil {
- return nil, err
- }
-
- _, err = io.Copy(f, strings.NewReader(strings.Join(body, "\n\n")))
- if err != nil {
- return nil, err
- }
-
- if err := f.Close(); err != nil {
- return nil, err
- }
- return f, nil
-}
-
-const radio = `I was tuning in the shine on the late night dial
-Doing anything my radio advised
-With every one of those late night stations
-Playing songs bringing tears to my eyes
-I was seriously thinking about hiding the receiver
-When the switch broke 'cause it's old
-They're saying things that I can hardly believe
-They really think we're getting out of control
-Radio is a sound salvation
-Radio is cleaning up the nation
-They say you better listen to the voice of reason
-But they don't give you any choice 'cause they think that it's treason
-So you had better do as you are told
-You better listen to the radio
-I wanna bite the hand that feeds me
-I wanna bite that hand so badly
-I want to make them wish they'd never seen me
-Some of my friends sit around every evening
-And they worry about the times ahead
-But everybody else is overwhelmed by indifference
-And the promise of an early bed
-You either shut up or get cut up; they don't wanna hear about it
-It's only inches on the reel-to-reel
-And the radio is in the hands of such a lot of fools
-Tryin' to anesthetize the way that you feel
-Radio is a sound salvation
-Radio is cleaning up the nation
-They say you better listen to the voice of reason
-But they don't give you any choice 'cause they think that it's treason
-So you had better do as you are told
-You better listen to the radio
-Wonderful radio
-Marvelous radio
-Wonderful radio
-Radio, radio`
diff --git a/stat.go b/stat.go
deleted file mode 100644
index d76c264..0000000
--- a/stat.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package pkger
-
-import "github.com/markbates/pkger/here"
-
-func Stat() (here.Info, error) {
- var err error
- curOnce.Do(func() {
- if currentInfo.IsZero() {
- currentInfo, err = here.Current()
- }
- })
-
- return currentInfo, err
-}
diff --git a/version.go b/version.go
deleted file mode 100644
index 6a02283..0000000
--- a/version.go
+++ /dev/null
@@ -1,4 +0,0 @@
-package pkger
-
-// Version of pkger
-const Version = "v0.0.1"
diff --git a/walk.go b/walk.go
deleted file mode 100644
index 1f027e8..0000000
--- a/walk.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package pkger
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "strings"
-
- "github.com/markbates/pkger/here"
-)
-
-type WalkFunc func(Path, os.FileInfo) error
-
-func Walk(p string, wf WalkFunc) error {
- pt, err := Parse(p)
- if err != nil {
- return err
- }
-
- filesCache.Range(func(k Path, v *File) bool {
- if k.Pkg != pt.Pkg {
- return true
- }
- if !strings.HasPrefix(k.Name, pt.Name) {
- return true
- }
- if err = wf(k, v.info); err != nil {
- if err == filepath.SkipDir {
- return true
- }
- return false
- }
- return true
- })
-
- if packed {
- return nil
- }
-
- var info here.Info
- if pt.Pkg == "." {
- info, err = Stat()
- if err != nil {
- return err
- }
- pt.Pkg = info.ImportPath
- }
-
- if info.IsZero() {
- info, err = Info(pt.Pkg)
- if err != nil {
- return fmt.Errorf("%s: %s", pt, err)
- }
- }
- fp := filepath.Join(info.Dir, pt.Name)
- err = filepath.Walk(fp, func(path string, fi os.FileInfo, err error) error {
- if err != nil {
- return err
- }
-
- path = strings.TrimPrefix(path, info.Dir)
- pt, err := Parse(fmt.Sprintf("%s:%s", pt.Pkg, path))
- if err != nil {
- return err
- }
- return wf(pt, WithName(path, NewFileInfo(fi)))
- })
-
- return err
-}