forked from mirror/pkger
please bring me back
This commit is contained in:
parent
18375ac12e
commit
145161837e
|
@ -7,8 +7,8 @@ import (
|
|||
"sort"
|
||||
|
||||
"github.com/markbates/pkger"
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/parser"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
"github.com/markbates/pkger/stuffing"
|
||||
)
|
||||
|
||||
|
@ -30,16 +30,16 @@ func (e *packCmd) Exec(args []string) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(info)
|
||||
res, err := parser.Parse(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if e.list {
|
||||
fmt.Println(res.Path)
|
||||
fmt.Println(info.ImportPath)
|
||||
|
||||
for _, p := range res.Paths {
|
||||
for _, p := range res {
|
||||
fmt.Printf(" > %s\n", p)
|
||||
}
|
||||
return nil
|
||||
|
@ -48,7 +48,7 @@ func (e *packCmd) Exec(args []string) error {
|
|||
fp := info.FilePath(outName)
|
||||
os.RemoveAll(fp)
|
||||
|
||||
if err := Package(fp, res.Paths); err != nil {
|
||||
if err := Package(fp, res); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -118,7 +118,7 @@ func (e *packCmd) Flags() *flag.FlagSet {
|
|||
return e.FlagSet
|
||||
}
|
||||
|
||||
func Package(out string, paths []pkging.Path) error {
|
||||
func Package(out string, paths []here.Path) error {
|
||||
os.RemoveAll(out)
|
||||
|
||||
f, err := os.Create(out)
|
||||
|
|
|
@ -588,6 +588,8 @@ github.com/markbates/grift v1.0.5/go.mod h1:EHmVIjOQoj/OOBDzlZ8RW0ZkvOtQ4xRHjrPv
|
|||
github.com/markbates/grift v1.0.6/go.mod h1:2AUYA/+pODhwonRbYwsltPVPIztBzw5nIJEGiWgKMPM=
|
||||
github.com/markbates/grift v1.1.0 h1:DsljFKUSK1ELpU22ZE+Gi93jiQI3cYD/RQ+vHM/PpY8=
|
||||
github.com/markbates/grift v1.1.0/go.mod h1:8N7ybWEcnMOvtSb0kW+dLJpYii9eq/FP3Gtu/cNPDTY=
|
||||
github.com/markbates/hepa v0.0.0-20190718154049-1d900199db5b h1:ns0oO2sMEoFJMmrbiWzGQO5AR3GgqfYRAos0gz8C0Cw=
|
||||
github.com/markbates/hepa v0.0.0-20190718154049-1d900199db5b/go.mod h1:jHlCX3RNqF+epcY1FxjLyDGzr3l9+mNCh3YDDw6BFvY=
|
||||
github.com/markbates/hmax v1.0.0/go.mod h1:cOkR9dktiESxIMu+65oc/r/bdY4bE8zZw3OLhLx0X2c=
|
||||
github.com/markbates/hmax v1.1.0/go.mod h1:hhn8pJiRwNTEmNlxhfiTbL+CtEYiAX3wuhSf/kg/6wI=
|
||||
github.com/markbates/inflect v1.0.0/go.mod h1:oTeZL2KHA7CUX6X+fovmK9OvIOFuqu0TwdQrZjLTh88=
|
||||
|
|
|
@ -22,10 +22,11 @@ func main() {
|
|||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Println(current)
|
||||
|
||||
fmt.Printf("Walking files for %s\n", current.ImportPath)
|
||||
// walk the files in this module. "/" is where the `go.mod` for this module is
|
||||
err = pkger.Walk("/", func(path string, info os.FileInfo, err error) error {
|
||||
err = pkger.Walk("github.com/gobuffalo/buffalo:/", func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
example
|
||||
app
|
||||
pkged.go
|
|
@ -0,0 +1,7 @@
|
|||
FROM alpine
|
||||
|
||||
EXPOSE 3000
|
||||
COPY example /bin/
|
||||
RUN ls -la
|
||||
|
||||
CMD /bin/example
|
|
@ -0,0 +1,7 @@
|
|||
default:
|
||||
cd ../../cmd/pkger && go install -v .
|
||||
pkger -list
|
||||
pkger
|
||||
GOOS=linux go build -v -o example
|
||||
docker build -t pkger:example .
|
||||
docker run -p 3000:3000 pkger:example
|
|
@ -0,0 +1,17 @@
|
|||
package api
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
|
||||
"github.com/markbates/pkger"
|
||||
)
|
||||
|
||||
func Version() (string, error) {
|
||||
f, err := pkger.Open("github.com/markbates/pkger/examples/complex/api:/version.txt")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer f.Close()
|
||||
b, err := ioutil.ReadAll(f)
|
||||
return string(b), err
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
module github.com/markbates/pkger/examples/complex/api
|
||||
|
||||
go 1.13
|
||||
|
||||
require github.com/markbates/pkger v0.0.0
|
||||
|
||||
replace github.com/markbates/pkger => ../../../
|
|
@ -0,0 +1,16 @@
|
|||
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/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc=
|
||||
github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
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/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
@ -0,0 +1 @@
|
|||
v1.0.0
|
|
@ -0,0 +1,12 @@
|
|||
module github.com/markbates/pkger/examples/complex
|
||||
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/markbates/pkger v0.0.0
|
||||
github.com/markbates/pkger/examples/complex/api v0.0.0
|
||||
)
|
||||
|
||||
replace github.com/markbates/pkger => ../../
|
||||
|
||||
replace github.com/markbates/pkger/examples/complex/api => ./api
|
|
@ -0,0 +1,23 @@
|
|||
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/markbates/hepa v0.0.0-20190718154049-1d900199db5b h1:ns0oO2sMEoFJMmrbiWzGQO5AR3GgqfYRAos0gz8C0Cw=
|
||||
github.com/markbates/hepa v0.0.0-20190718154049-1d900199db5b/go.mod h1:jHlCX3RNqF+epcY1FxjLyDGzr3l9+mNCh3YDDw6BFvY=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
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=
|
|
@ -0,0 +1,26 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/markbates/pkger/examples/complex/api"
|
||||
)
|
||||
|
||||
const host = ":3000"
|
||||
|
||||
func main() {
|
||||
v, err := api.Version()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Println("Version: ", v)
|
||||
|
||||
if err := writeFile(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := readFile(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"github.com/markbates/pkger"
|
||||
)
|
||||
|
||||
func readFile() error {
|
||||
f, err := pkger.Open("/go.mod")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
_, err = io.Copy(os.Stdout, f)
|
||||
return err
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/markbates/pkger"
|
||||
)
|
||||
|
||||
// writeFile will write *REAL* files when
|
||||
// not packaged. When packaged, writeFile
|
||||
// will write into memory instead.
|
||||
func writeFile() error {
|
||||
// make a folder structure to write into.
|
||||
// just like the `os` package directory
|
||||
// structures are *NOT* created for you.
|
||||
if err := pkger.MkdirAll("/delta/88", 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
// remove the /delta folder and anything
|
||||
// underneath it
|
||||
defer pkger.RemoveAll("/delta")
|
||||
|
||||
// create a new file under the `/delta/88`
|
||||
// directory named `a.car`.
|
||||
f, err := pkger.Create("/delta/88/a.car")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
msg := []byte("The Caravan Stops")
|
||||
i, err := f.Write(msg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if i != len(msg) {
|
||||
return fmt.Errorf("expected to write %d bytes, wrote %d instead", len(msg), i)
|
||||
}
|
||||
|
||||
// close the file
|
||||
if err := f.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// stat the new file and get back its os.FileInfo
|
||||
info, err := pkger.Stat("/delta/88/a.car")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println("info.Name()\t", info.Name())
|
||||
fmt.Println("info.Size()\t", info.Size())
|
||||
fmt.Println("info.Mode()\t", info.Mode())
|
||||
fmt.Println("info.IsDir()\t", info.IsDir())
|
||||
|
||||
return nil
|
||||
}
|
5
go.mod
5
go.mod
|
@ -3,7 +3,10 @@ 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/markbates/oncer v1.0.0
|
||||
github.com/markbates/hepa v0.0.0-20190718154049-1d900199db5b
|
||||
github.com/stretchr/testify v1.4.0
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
||||
)
|
||||
|
|
12
go.sum
12
go.sum
|
@ -2,17 +2,23 @@ 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/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY=
|
||||
github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI=
|
||||
github.com/markbates/hepa v0.0.0-20190718154049-1d900199db5b h1:ns0oO2sMEoFJMmrbiWzGQO5AR3GgqfYRAos0gz8C0Cw=
|
||||
github.com/markbates/hepa v0.0.0-20190718154049-1d900199db5b/go.mod h1:jHlCX3RNqF+epcY1FxjLyDGzr3l9+mNCh3YDDw6BFvY=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
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=
|
||||
|
|
107
here/info.go
107
here/info.go
|
@ -2,29 +2,51 @@ package here
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/markbates/hepa"
|
||||
"github.com/markbates/hepa/filters"
|
||||
)
|
||||
|
||||
// Info represents details about the directory/package
|
||||
type Info struct {
|
||||
Dir string
|
||||
ImportPath string
|
||||
Name string
|
||||
Doc string
|
||||
Target string
|
||||
Root string
|
||||
Match []string
|
||||
Stale bool
|
||||
StaleReason string
|
||||
GoFiles []string
|
||||
Imports []string
|
||||
Deps []string
|
||||
TestGoFiles []string
|
||||
TestImports []string
|
||||
Module Module
|
||||
Dir string
|
||||
ImportPath string
|
||||
Name string
|
||||
Imports []string
|
||||
Module Module
|
||||
}
|
||||
|
||||
func (fi Info) MarshalJSON() ([]byte, error) {
|
||||
mm := map[string]interface{}{
|
||||
"ImportPath": fi.ImportPath,
|
||||
"Name": fi.Name,
|
||||
"Imports": fi.Imports,
|
||||
"Module": fi.Module,
|
||||
}
|
||||
|
||||
hep := hepa.New()
|
||||
hep = hepa.With(hep, filters.Home())
|
||||
hep = hepa.With(hep, filters.Golang())
|
||||
|
||||
cm := map[string]string{
|
||||
"Dir": fi.Dir,
|
||||
}
|
||||
|
||||
for k, v := range cm {
|
||||
b, err := hep.Filter([]byte(v))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mm[k] = string(b)
|
||||
}
|
||||
|
||||
return json.Marshal(mm)
|
||||
}
|
||||
|
||||
func (i Info) FilePath(paths ...string) string {
|
||||
|
@ -74,3 +96,58 @@ func (i Info) String() string {
|
|||
s := string(b)
|
||||
return s
|
||||
}
|
||||
|
||||
func (i Info) Parse(p string) (Path, error) {
|
||||
p = strings.TrimSpace(p)
|
||||
p = filepath.Clean(p)
|
||||
p = strings.TrimPrefix(p, i.Dir)
|
||||
|
||||
p = strings.Replace(p, "\\", "/", -1)
|
||||
p = strings.TrimSpace(p)
|
||||
|
||||
if len(p) == 0 || p == ":" {
|
||||
return i.build("", "", "")
|
||||
}
|
||||
|
||||
res := pathrx.FindAllStringSubmatch(p, -1)
|
||||
if len(res) == 0 {
|
||||
return Path{}, fmt.Errorf("could not parse %q", p)
|
||||
}
|
||||
|
||||
matches := res[0]
|
||||
|
||||
if len(matches) != 4 {
|
||||
return Path{}, fmt.Errorf("could not parse %q", p)
|
||||
}
|
||||
|
||||
return i.build(p, matches[1], matches[3])
|
||||
}
|
||||
|
||||
func (i Info) build(p, pkg, name string) (Path, error) {
|
||||
pt := Path{
|
||||
Pkg: pkg,
|
||||
Name: name,
|
||||
}
|
||||
|
||||
if strings.HasPrefix(pt.Pkg, "/") || len(pt.Pkg) == 0 {
|
||||
pt.Name = pt.Pkg
|
||||
pt.Pkg = i.ImportPath
|
||||
}
|
||||
|
||||
if len(pt.Name) == 0 {
|
||||
pt.Name = "/"
|
||||
}
|
||||
|
||||
if pt.Pkg == pt.Name {
|
||||
pt.Pkg = i.ImportPath
|
||||
pt.Name = "/"
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(pt.Name, "/") {
|
||||
pt.Name = "/" + pt.Name
|
||||
}
|
||||
pt.Name = strings.TrimPrefix(pt.Name, i.Dir)
|
||||
return pt, nil
|
||||
}
|
||||
|
||||
var pathrx = regexp.MustCompile("([^:]+)(:(/.+))?")
|
||||
|
|
|
@ -1,13 +1,45 @@
|
|||
package here
|
||||
|
||||
import "encoding/json"
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"github.com/markbates/hepa"
|
||||
"github.com/markbates/hepa/filters"
|
||||
)
|
||||
|
||||
type Module struct {
|
||||
Path string `json:"Path"`
|
||||
Main bool `json:"Main"`
|
||||
Dir string `json:"Dir"`
|
||||
GoMod string `json:"GoMod"`
|
||||
GoVersion string `json:"GoVersion"`
|
||||
Path string
|
||||
Main bool
|
||||
Dir string
|
||||
GoMod string
|
||||
GoVersion string
|
||||
}
|
||||
|
||||
func (m Module) MarshalJSON() ([]byte, error) {
|
||||
mm := map[string]interface{}{
|
||||
"Main": m.Main,
|
||||
"GoVersion": m.GoVersion,
|
||||
}
|
||||
|
||||
hep := hepa.New()
|
||||
hep = hepa.With(hep, filters.Home())
|
||||
hep = hepa.With(hep, filters.Golang())
|
||||
|
||||
cm := map[string]string{
|
||||
"Path": m.Path,
|
||||
"Dir": m.Dir,
|
||||
"GoMod": m.GoMod,
|
||||
}
|
||||
|
||||
for k, v := range cm {
|
||||
b, err := hep.Filter([]byte(v))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mm[k] = string(b)
|
||||
}
|
||||
|
||||
return json.Marshal(mm)
|
||||
}
|
||||
|
||||
func (i Module) String() string {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package pkging
|
||||
package here
|
||||
|
||||
import (
|
||||
"encoding/json"
|
|
@ -8,11 +8,12 @@ import (
|
|||
"sort"
|
||||
"sync"
|
||||
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
)
|
||||
|
||||
// Files wraps sync.Map and uses the following types:
|
||||
// key: pkging.Path
|
||||
// key: here.Path
|
||||
// value: pkging.File
|
||||
type Files struct {
|
||||
data *sync.Map
|
||||
|
@ -58,7 +59,7 @@ func (m *Files) UnmarshalJSON(b []byte) error {
|
|||
return err
|
||||
}
|
||||
for k, v := range mm {
|
||||
var pt pkging.Path
|
||||
var pt here.Path
|
||||
if err := json.Unmarshal([]byte(k), &pt); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -68,7 +69,7 @@ func (m *Files) UnmarshalJSON(b []byte) error {
|
|||
}
|
||||
|
||||
// Delete the key from the map
|
||||
func (m *Files) Delete(key pkging.Path) {
|
||||
func (m *Files) Delete(key here.Path) {
|
||||
m.Data().Delete(key)
|
||||
}
|
||||
|
||||
|
@ -76,7 +77,7 @@ func (m *Files) Delete(key pkging.Path) {
|
|||
// Returns pkging.File or bool.
|
||||
// A false return indicates either the key was not found
|
||||
// or the value is not of type pkging.File
|
||||
func (m *Files) Load(key pkging.Path) (pkging.File, bool) {
|
||||
func (m *Files) Load(key here.Path) (pkging.File, bool) {
|
||||
i, ok := m.Data().Load(key)
|
||||
if !ok {
|
||||
return nil, false
|
||||
|
@ -86,9 +87,9 @@ func (m *Files) Load(key pkging.Path) (pkging.File, bool) {
|
|||
}
|
||||
|
||||
// Range over the pkging.File values in the map
|
||||
func (m *Files) Range(f func(key pkging.Path, value pkging.File) bool) {
|
||||
func (m *Files) Range(f func(key here.Path, value pkging.File) bool) {
|
||||
m.Data().Range(func(k, v interface{}) bool {
|
||||
key, ok := k.(pkging.Path)
|
||||
key, ok := k.(here.Path)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
@ -101,14 +102,14 @@ func (m *Files) Range(f func(key pkging.Path, value pkging.File) bool) {
|
|||
}
|
||||
|
||||
// Store a pkging.File in the map
|
||||
func (m *Files) Store(key pkging.Path, value pkging.File) {
|
||||
func (m *Files) Store(key here.Path, value pkging.File) {
|
||||
m.Data().Store(key, value)
|
||||
}
|
||||
|
||||
// Keys returns a list of keys in the map
|
||||
func (m *Files) Keys() []pkging.Path {
|
||||
var keys []pkging.Path
|
||||
m.Range(func(key pkging.Path, value pkging.File) bool {
|
||||
func (m *Files) Keys() []here.Path {
|
||||
var keys []here.Path
|
||||
m.Range(func(key here.Path, value pkging.File) bool {
|
||||
keys = append(keys, key)
|
||||
return true
|
||||
})
|
||||
|
|
|
@ -1,165 +0,0 @@
|
|||
package maps
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
)
|
||||
|
||||
// Paths wraps sync.Map and uses the following types:
|
||||
// key: string
|
||||
// value: Path
|
||||
type Paths struct {
|
||||
Current here.Info
|
||||
data *sync.Map
|
||||
once *sync.Once
|
||||
}
|
||||
|
||||
func (m *Paths) 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 *Paths) 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 *Paths) UnmarshalJSON(b []byte) error {
|
||||
mm := map[string]pkging.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 *Paths) 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 *Paths) Load(key string) (pkging.Path, bool) {
|
||||
i, ok := m.Data().Load(key)
|
||||
if !ok {
|
||||
return pkging.Path{}, false
|
||||
}
|
||||
s, ok := i.(pkging.Path)
|
||||
return s, ok
|
||||
}
|
||||
|
||||
// Range over the Path values in the map
|
||||
func (m *Paths) Range(f func(key string, value pkging.Path) bool) {
|
||||
m.Data().Range(func(k, v interface{}) bool {
|
||||
key, ok := k.(string)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
value, ok := v.(pkging.Path)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return f(key, value)
|
||||
})
|
||||
}
|
||||
|
||||
// Store a Path in the map
|
||||
func (m *Paths) Store(key string, value pkging.Path) {
|
||||
m.Data().Store(key, value)
|
||||
}
|
||||
|
||||
// Keys returns a list of keys in the map
|
||||
func (m *Paths) Keys() []string {
|
||||
var keys []string
|
||||
m.Range(func(key string, value pkging.Path) bool {
|
||||
keys = append(keys, key)
|
||||
return true
|
||||
})
|
||||
sort.Strings(keys)
|
||||
return keys
|
||||
}
|
||||
|
||||
func (m *Paths) Parse(p string) (pkging.Path, error) {
|
||||
p = strings.TrimSpace(p)
|
||||
p = filepath.Clean(p)
|
||||
p = strings.TrimPrefix(p, m.Current.Dir)
|
||||
|
||||
p = strings.Replace(p, "\\", "/", -1)
|
||||
p = strings.TrimSpace(p)
|
||||
|
||||
pt, ok := m.Load(p)
|
||||
if ok {
|
||||
return pt, nil
|
||||
}
|
||||
if len(p) == 0 || p == ":" {
|
||||
return m.build("", "", "")
|
||||
}
|
||||
|
||||
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 m.build(p, matches[1], matches[3])
|
||||
}
|
||||
|
||||
var pathrx = regexp.MustCompile("([^:]+)(:(/.+))?")
|
||||
|
||||
func (m *Paths) build(p, pkg, name string) (pkging.Path, error) {
|
||||
pt := pkging.Path{
|
||||
Pkg: pkg,
|
||||
Name: name,
|
||||
}
|
||||
|
||||
if strings.HasPrefix(pt.Pkg, "/") || len(pt.Pkg) == 0 {
|
||||
pt.Name = pt.Pkg
|
||||
pt.Pkg = m.Current.ImportPath
|
||||
}
|
||||
|
||||
if len(pt.Name) == 0 {
|
||||
pt.Name = "/"
|
||||
}
|
||||
|
||||
if pt.Pkg == pt.Name {
|
||||
pt.Pkg = m.Current.ImportPath
|
||||
pt.Name = "/"
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(pt.Name, "/") {
|
||||
pt.Name = "/" + pt.Name
|
||||
}
|
||||
pt.Name = strings.TrimPrefix(pt.Name, m.Current.Dir)
|
||||
m.Store(p, pt)
|
||||
return pt, nil
|
||||
}
|
|
@ -5,46 +5,25 @@ import (
|
|||
"go/parser"
|
||||
"go/token"
|
||||
"os"
|
||||
"sort"
|
||||
|
||||
"github.com/markbates/oncer"
|
||||
"github.com/markbates/pkger"
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
)
|
||||
|
||||
var DefaultIgnoredFolders = []string{".", "_", "vendor", "node_modules", "_fixtures", "testdata"}
|
||||
|
||||
func Parse(her here.Info) (Results, error) {
|
||||
var r Results
|
||||
var err error
|
||||
func Parse(her here.Info) ([]here.Path, error) {
|
||||
|
||||
oncer.Do(her.ImportPath, func() {
|
||||
pwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer os.Chdir(pwd)
|
||||
src, err := fromSource(her)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fmt.Println("cd: ", her.Dir, her.ImportPath)
|
||||
os.Chdir(her.Dir)
|
||||
|
||||
// 1. search for .go files in/imported by `her.ImportPath`
|
||||
src, err := fromSource(her)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
fmt.Println(">>>TODO parser/parser.go:30: src ", src)
|
||||
|
||||
// 2. parse .go ast's for `pkger.*` calls
|
||||
// 3. find path's in those files
|
||||
// 4. walk folders in those paths and add to results
|
||||
})
|
||||
|
||||
return r, err
|
||||
return src, nil
|
||||
}
|
||||
|
||||
func fromSource(her here.Info) ([]pkging.Path, error) {
|
||||
fmt.Println(">>>TODO parser/parser.go:201: her.ImportPath ", her.ImportPath)
|
||||
fmt.Println(her)
|
||||
func fromSource(her here.Info) ([]here.Path, error) {
|
||||
root := her.Dir
|
||||
fi, err := os.Stat(root)
|
||||
if err != nil {
|
||||
|
@ -60,11 +39,16 @@ func fromSource(her here.Info) ([]pkging.Path, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var paths []pkging.Path
|
||||
pm := map[string]here.Path{}
|
||||
for _, pkg := range pkgs {
|
||||
for _, pf := range pkg.Files {
|
||||
f := &file{fset: fset, astFile: pf, filename: pf.Name.Name}
|
||||
f := &file{
|
||||
info: her,
|
||||
fset: fset,
|
||||
astFile: pf,
|
||||
filename: pf.Name.Name,
|
||||
paths: map[string]here.Path{},
|
||||
}
|
||||
f.decls = make(map[string]string)
|
||||
|
||||
x, err := f.find()
|
||||
|
@ -76,15 +60,46 @@ func fromSource(her here.Info) ([]pkging.Path, error) {
|
|||
pt.Pkg = her.ImportPath
|
||||
x[i] = pt
|
||||
}
|
||||
paths = append(paths, x[i])
|
||||
pt = x[i]
|
||||
pm[pt.String()] = pt
|
||||
err = pkger.Walk(pt.String(), func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
p, err := her.Parse(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if pt.Name != "/" {
|
||||
p.Name = pt.Name + p.Name
|
||||
}
|
||||
pm[p.String()] = p
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var paths []here.Path
|
||||
|
||||
for _, i := range her.Imports {
|
||||
fmt.Println(">>>TODO parser/parser.go:237: i ", i)
|
||||
for _, v := range pm {
|
||||
paths = append(paths, v)
|
||||
}
|
||||
|
||||
sort.Slice(paths, func(i, j int) bool {
|
||||
return paths[i].String() < paths[j].String()
|
||||
})
|
||||
|
||||
// for _, i := range her.Imports {
|
||||
// fmt.Println(">>>TODO parser/parser.go:237: i ", i)
|
||||
// }
|
||||
|
||||
return paths, nil
|
||||
}
|
||||
|
||||
|
@ -127,6 +142,6 @@ func fromSource(her here.Info) ([]pkging.Path, error) {
|
|||
// }
|
||||
|
||||
type Results struct {
|
||||
Paths []pkging.Path
|
||||
Path pkging.Path
|
||||
Paths []here.Path
|
||||
Path here.Path
|
||||
}
|
||||
|
|
|
@ -18,10 +18,10 @@ func Test_Parser(t *testing.T) {
|
|||
|
||||
ch := filepath.Join(pwd, "..",
|
||||
"examples",
|
||||
"app")
|
||||
"complex")
|
||||
info := here.Info{
|
||||
Dir: ch,
|
||||
ImportPath: "github.com/markbates/pkger/examples/app",
|
||||
ImportPath: "github.com/markbates/pkger/examples/complex",
|
||||
}
|
||||
|
||||
res, err := Parse(info)
|
||||
|
@ -29,19 +29,20 @@ func Test_Parser(t *testing.T) {
|
|||
r.NoError(err)
|
||||
|
||||
exp := []string{
|
||||
"github.com/markbates/pkger/examples/app:/",
|
||||
"github.com/markbates/pkger/examples/app:/public",
|
||||
"github.com/markbates/pkger/examples/app:/public/images/mark-small.png",
|
||||
"github.com/markbates/pkger/examples/app:/public/images/mark.png",
|
||||
"github.com/markbates/pkger/examples/app:/public/images/mark_250px.png",
|
||||
"github.com/markbates/pkger/examples/app:/public/images/mark_400px.png",
|
||||
"github.com/markbates/pkger/examples/app:/public/index.html",
|
||||
"github.com/markbates/pkger/examples/complex:/",
|
||||
"github.com/markbates/pkger/examples/complex:/go.mod",
|
||||
// "github.com/markbates/pkger/examples/app:/public",
|
||||
// "github.com/markbates/pkger/examples/app:/public/images/mark-small.png",
|
||||
// "github.com/markbates/pkger/examples/app:/public/images/mark.png",
|
||||
// "github.com/markbates/pkger/examples/app:/public/images/mark_250px.png",
|
||||
// "github.com/markbates/pkger/examples/app:/public/images/mark_400px.png",
|
||||
// "github.com/markbates/pkger/examples/app:/public/index.html",
|
||||
}
|
||||
sort.Strings(exp)
|
||||
|
||||
act := make([]string, len(res.Paths))
|
||||
for i := 0; i < len(res.Paths); i++ {
|
||||
act[i] = res.Paths[i].String()
|
||||
act := make([]string, len(res))
|
||||
for i := 0; i < len(res); i++ {
|
||||
act[i] = res[i].String()
|
||||
}
|
||||
|
||||
sort.Strings(act)
|
||||
|
|
|
@ -4,11 +4,10 @@ import (
|
|||
"fmt"
|
||||
"go/ast"
|
||||
"go/token"
|
||||
"sort"
|
||||
"strconv"
|
||||
|
||||
"github.com/markbates/pkger"
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
)
|
||||
|
||||
type visitor func(node ast.Node) (w ast.Visitor)
|
||||
|
@ -19,18 +18,20 @@ func (v visitor) Visit(node ast.Node) ast.Visitor {
|
|||
|
||||
// inspired by https://gist.github.com/cryptix/d1b129361cea51a59af2
|
||||
type file struct {
|
||||
info here.Info
|
||||
fset *token.FileSet
|
||||
astFile *ast.File
|
||||
filename string
|
||||
decls map[string]string
|
||||
paths []pkging.Path
|
||||
paths map[string]here.Path
|
||||
}
|
||||
|
||||
func (f *file) walk(fn func(ast.Node) bool) {
|
||||
ast.Walk(walker(fn), f.astFile)
|
||||
}
|
||||
|
||||
func (f *file) find() ([]pkging.Path, error) {
|
||||
func (f *file) find() ([]here.Path, error) {
|
||||
f.paths = map[string]here.Path{}
|
||||
if err := f.findDecals(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -46,7 +47,14 @@ func (f *file) find() ([]pkging.Path, error) {
|
|||
return nil, err
|
||||
}
|
||||
|
||||
return f.paths, nil
|
||||
var paths []here.Path
|
||||
for _, p := range f.paths {
|
||||
paths = append(paths, p)
|
||||
}
|
||||
sort.Slice(paths, func(a, b int) bool {
|
||||
return paths[a].String() < paths[b].String()
|
||||
})
|
||||
return paths, nil
|
||||
}
|
||||
|
||||
func (f *file) findDecals() error {
|
||||
|
@ -113,12 +121,13 @@ func (f *file) findOpenCalls() error {
|
|||
err = nil
|
||||
return false
|
||||
}
|
||||
pt, err := pkger.Parse(s)
|
||||
pt, err := f.info.Parse(s)
|
||||
fmt.Println(">>>TODO parser/visitor.go:124: pt ", pt)
|
||||
if err != nil {
|
||||
err = err
|
||||
return false
|
||||
}
|
||||
f.paths = append(f.paths, pt)
|
||||
f.paths[pt.String()] = pt
|
||||
case *ast.Ident:
|
||||
val, ok := f.decls[x.Name]
|
||||
if !ok {
|
||||
|
@ -131,12 +140,13 @@ func (f *file) findOpenCalls() error {
|
|||
err = nil
|
||||
return false
|
||||
}
|
||||
pt, err := pkger.Parse(s)
|
||||
pt, err := f.info.Parse(s)
|
||||
fmt.Println(">>>TODO parser/visitor.go:144: pt ", pt)
|
||||
if err != nil {
|
||||
err = err
|
||||
return false
|
||||
}
|
||||
f.paths = append(f.paths, pt)
|
||||
f.paths[pt.String()] = pt
|
||||
|
||||
default:
|
||||
}
|
||||
|
@ -167,12 +177,13 @@ func (f *file) findWalkCalls() error {
|
|||
err = nil
|
||||
return false
|
||||
}
|
||||
pt, err := pkger.Parse(s)
|
||||
pt, err := f.info.Parse(s)
|
||||
if err != nil {
|
||||
err = err
|
||||
return false
|
||||
}
|
||||
f.paths = append(f.paths, pt)
|
||||
fmt.Println(">>>TODO parser/visitor.go:185: pt ", pt)
|
||||
f.paths[pt.String()] = pt
|
||||
case *ast.Ident:
|
||||
val, ok := f.decls[x.Name]
|
||||
if !ok {
|
||||
|
@ -185,12 +196,13 @@ func (f *file) findWalkCalls() error {
|
|||
err = nil
|
||||
return false
|
||||
}
|
||||
pt, err := pkger.Parse(s)
|
||||
pt, err := f.info.Parse(s)
|
||||
if err != nil {
|
||||
err = err
|
||||
return false
|
||||
}
|
||||
f.paths = append(f.paths, pt)
|
||||
fmt.Println(">>>TODO parser/visitor.go:204: pt ", pt)
|
||||
f.paths[pt.String()] = pt
|
||||
|
||||
default:
|
||||
}
|
||||
|
@ -203,25 +215,26 @@ func (f *file) findWalkCalls() error {
|
|||
func (f *file) findImportCalls() error {
|
||||
var err error
|
||||
f.walk(func(node ast.Node) bool {
|
||||
ce, ok := node.(*ast.ImportSpec)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
// ce, ok := node.(*ast.ImportSpec)
|
||||
// if !ok {
|
||||
// return true
|
||||
// }
|
||||
|
||||
s, err := strconv.Unquote(ce.Path.Value)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
info, err := here.Package(s)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
fmt.Println(">>>TODO parser/visitor.go:216: info ", info)
|
||||
res, err := Parse(info)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
fmt.Println(">>>TODO parser/visitor.go:224: res ", res)
|
||||
// s, err := strconv.Unquote(ce.Path.Value)
|
||||
// if err != nil {
|
||||
// return false
|
||||
// }
|
||||
// fmt.Println(">>>TODO parser/visitor.go:215: s ", s)
|
||||
// info, err := here.Package(s)
|
||||
// if err != nil {
|
||||
// return false
|
||||
// }
|
||||
// fmt.Println(">>>TODO parser/visitor.go:216: info ", info)
|
||||
// res, err := Parse(info)
|
||||
// if err != nil {
|
||||
// return false
|
||||
// }
|
||||
// fmt.Println(">>>TODO parser/visitor.go:224: res ", res)
|
||||
return true
|
||||
})
|
||||
return err
|
||||
|
|
10
pkger.go
10
pkger.go
|
@ -15,7 +15,11 @@ var current pkging.Pkger
|
|||
var gil = &sync.RWMutex{}
|
||||
|
||||
var disk = func() pkging.Pkger {
|
||||
n, err := stdos.New()
|
||||
her, err := here.Current()
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
n, err := stdos.New(her)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
|
@ -31,7 +35,7 @@ func impl() pkging.Pkger {
|
|||
return current
|
||||
}
|
||||
|
||||
func Parse(p string) (pkging.Path, error) {
|
||||
func Parse(p string) (here.Path, error) {
|
||||
return impl().Parse(p)
|
||||
}
|
||||
|
||||
|
@ -39,7 +43,7 @@ func Abs(p string) (string, error) {
|
|||
return impl().Abs(p)
|
||||
}
|
||||
|
||||
func AbsPath(p pkging.Path) (string, error) {
|
||||
func AbsPath(p here.Path) (string, error) {
|
||||
return impl().AbsPath(p)
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ import (
|
|||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/markbates/pkger/pkging"
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
|
@ -32,7 +32,7 @@ func Test_Abs(t *testing.T) {
|
|||
func Test_AbsPath(t *testing.T) {
|
||||
r := require.New(t)
|
||||
|
||||
s, err := AbsPath(pkging.Path{
|
||||
s, err := AbsPath(here.Path{
|
||||
Pkg: "github.com/markbates/pkger",
|
||||
Name: "/rocket.ship",
|
||||
})
|
||||
|
|
|
@ -13,7 +13,7 @@ type File interface {
|
|||
Info() here.Info
|
||||
Name() string
|
||||
Open(name string) (http.File, error)
|
||||
Path() Path
|
||||
Path() here.Path
|
||||
Read(p []byte) (int, error)
|
||||
Readdir(count int) ([]os.FileInfo, error)
|
||||
Seek(offset int64, whence int) (int64, error)
|
||||
|
|
|
@ -35,7 +35,14 @@ func Test_Pkger_MarshalEmbed(t *testing.T) {
|
|||
|
||||
pinfo, err := p2.Current()
|
||||
r.NoError(err)
|
||||
r.Equal(info, pinfo)
|
||||
r.Equal(info.ImportPath, pinfo.ImportPath)
|
||||
r.Equal(info.Name, pinfo.Name)
|
||||
r.Equal(info.Imports, pinfo.Imports)
|
||||
|
||||
m1 := info.Module
|
||||
m2 := pinfo.Module
|
||||
r.Equal(m1.Main, m2.Main)
|
||||
r.Equal(m1.GoVersion, m2.GoVersion)
|
||||
|
||||
var act []os.FileInfo
|
||||
err = p2.Walk("/", func(path string, info os.FileInfo, err error) error {
|
||||
|
|
|
@ -23,9 +23,9 @@ var _ pkging.File = &File{}
|
|||
type File struct {
|
||||
info *pkging.FileInfo
|
||||
her here.Info
|
||||
path pkging.Path
|
||||
path here.Path
|
||||
data []byte
|
||||
parent pkging.Path
|
||||
parent here.Path
|
||||
writer *bytes.Buffer
|
||||
reader io.Reader
|
||||
pkging pkging.Pkger
|
||||
|
@ -34,9 +34,9 @@ type File struct {
|
|||
type fJay struct {
|
||||
Info *pkging.FileInfo `json:"info"`
|
||||
Her here.Info `json:"her"`
|
||||
Path pkging.Path `json:"path"`
|
||||
Path here.Path `json:"path"`
|
||||
Data []byte `json:"data"`
|
||||
Parent pkging.Path `json:"parent"`
|
||||
Parent here.Path `json:"parent"`
|
||||
}
|
||||
|
||||
func (f File) MarshalJSON() ([]byte, error) {
|
||||
|
@ -134,7 +134,7 @@ func (f File) Abs() (string, error) {
|
|||
return f.pkging.AbsPath(f.Path())
|
||||
}
|
||||
|
||||
func (f File) Path() pkging.Path {
|
||||
func (f File) Path() here.Path {
|
||||
return f.path
|
||||
}
|
||||
|
||||
|
|
|
@ -25,10 +25,7 @@ func WithInfo(fx *Pkger, infos ...here.Info) {
|
|||
|
||||
func New(info here.Info) (*Pkger, error) {
|
||||
f := &Pkger{
|
||||
infos: &maps.Infos{},
|
||||
paths: &maps.Paths{
|
||||
Current: info,
|
||||
},
|
||||
infos: &maps.Infos{},
|
||||
files: &maps.Files{},
|
||||
current: info,
|
||||
}
|
||||
|
@ -39,14 +36,12 @@ func New(info here.Info) (*Pkger, error) {
|
|||
|
||||
type Pkger struct {
|
||||
infos *maps.Infos
|
||||
paths *maps.Paths
|
||||
files *maps.Files
|
||||
current here.Info
|
||||
}
|
||||
|
||||
type jay struct {
|
||||
Infos *maps.Infos `json:"infos"`
|
||||
Paths *maps.Paths `json:"paths"`
|
||||
Files map[string]*File `json:"files"`
|
||||
Current here.Info `json:"current"`
|
||||
}
|
||||
|
@ -54,7 +49,7 @@ type jay struct {
|
|||
func (p *Pkger) MarshalJSON() ([]byte, error) {
|
||||
files := map[string]*File{}
|
||||
|
||||
p.files.Range(func(key pkging.Path, file pkging.File) bool {
|
||||
p.files.Range(func(key here.Path, file pkging.File) bool {
|
||||
f, ok := file.(*File)
|
||||
if !ok {
|
||||
return true
|
||||
|
@ -65,7 +60,6 @@ func (p *Pkger) MarshalJSON() ([]byte, error) {
|
|||
|
||||
return json.Marshal(jay{
|
||||
Infos: p.infos,
|
||||
Paths: p.paths,
|
||||
Files: files,
|
||||
Current: p.current,
|
||||
})
|
||||
|
@ -82,9 +76,6 @@ func (p *Pkger) UnmarshalJSON(b []byte) error {
|
|||
|
||||
p.infos = y.Infos
|
||||
|
||||
p.paths = y.Paths
|
||||
p.paths.Current = p.current
|
||||
|
||||
p.files = &maps.Files{}
|
||||
for k, v := range y.Files {
|
||||
pt, err := p.Parse(k)
|
||||
|
@ -104,7 +95,7 @@ func (f *Pkger) Abs(p string) (string, error) {
|
|||
return f.AbsPath(pt)
|
||||
}
|
||||
|
||||
func (f *Pkger) AbsPath(pt pkging.Path) (string, error) {
|
||||
func (f *Pkger) AbsPath(pt here.Path) (string, error) {
|
||||
return pt.String(), nil
|
||||
}
|
||||
|
||||
|
@ -121,8 +112,8 @@ func (f *Pkger) Info(p string) (here.Info, error) {
|
|||
return info, nil
|
||||
}
|
||||
|
||||
func (f *Pkger) Parse(p string) (pkging.Path, error) {
|
||||
return f.paths.Parse(p)
|
||||
func (f *Pkger) Parse(p string) (here.Path, error) {
|
||||
return f.current.Parse(p)
|
||||
}
|
||||
|
||||
func (fx *Pkger) Remove(name string) error {
|
||||
|
@ -145,19 +136,13 @@ func (fx *Pkger) RemoveAll(name string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
fx.files.Range(func(key pkging.Path, file pkging.File) bool {
|
||||
fx.files.Range(func(key here.Path, file pkging.File) bool {
|
||||
if strings.HasPrefix(key.Name, pt.Name) {
|
||||
fx.files.Delete(key)
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
fx.paths.Range(func(key string, value pkging.Path) bool {
|
||||
if strings.HasPrefix(key, pt.Name) {
|
||||
fx.paths.Delete(key)
|
||||
}
|
||||
return true
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -235,7 +220,7 @@ func (fx *Pkger) MkdirAll(p string, perm os.FileMode) error {
|
|||
return err
|
||||
}
|
||||
for root != "" {
|
||||
pt := pkging.Path{
|
||||
pt := here.Path{
|
||||
Pkg: path.Pkg,
|
||||
Name: root,
|
||||
}
|
||||
|
|
|
@ -8,9 +8,9 @@ import (
|
|||
)
|
||||
|
||||
type Pkger interface {
|
||||
Parse(p string) (Path, error)
|
||||
Parse(p string) (here.Path, error)
|
||||
Abs(p string) (string, error)
|
||||
AbsPath(Path) (string, error)
|
||||
AbsPath(here.Path) (string, error)
|
||||
|
||||
Current() (here.Info, error)
|
||||
Info(p string) (here.Info, error)
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
"github.com/markbates/pkger/pkging/pkgutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
@ -323,17 +324,17 @@ func (s Suite) Test_Parse(t *testing.T) {
|
|||
ip := cur.ImportPath
|
||||
table := []struct {
|
||||
in string
|
||||
exp pkging.Path
|
||||
exp here.Path
|
||||
}{
|
||||
{in: mould, exp: pkging.Path{Pkg: ip, Name: mould}},
|
||||
{in: filepath.Join(cur.Dir, mould), exp: pkging.Path{Pkg: ip, Name: mould}},
|
||||
{in: ":" + mould, exp: pkging.Path{Pkg: ip, Name: mould}},
|
||||
{in: ip + ":" + mould, exp: pkging.Path{Pkg: ip, Name: mould}},
|
||||
{in: ip, exp: pkging.Path{Pkg: ip, Name: "/"}},
|
||||
{in: ":", exp: pkging.Path{Pkg: ip, Name: "/"}},
|
||||
{in: husker + ":" + mould, exp: pkging.Path{Pkg: husker, Name: mould}},
|
||||
{in: husker, exp: pkging.Path{Pkg: husker, Name: "/"}},
|
||||
{in: husker + ":", exp: pkging.Path{Pkg: husker, Name: "/"}},
|
||||
{in: mould, exp: here.Path{Pkg: ip, Name: mould}},
|
||||
{in: filepath.Join(cur.Dir, mould), exp: here.Path{Pkg: ip, Name: mould}},
|
||||
{in: ":" + mould, exp: here.Path{Pkg: ip, Name: mould}},
|
||||
{in: ip + ":" + mould, exp: here.Path{Pkg: ip, Name: mould}},
|
||||
{in: ip, exp: here.Path{Pkg: ip, Name: "/"}},
|
||||
{in: ":", exp: here.Path{Pkg: ip, Name: "/"}},
|
||||
{in: husker + ":" + mould, exp: here.Path{Pkg: husker, Name: mould}},
|
||||
{in: husker, exp: here.Path{Pkg: husker, Name: "/"}},
|
||||
{in: husker + ":", exp: here.Path{Pkg: husker, Name: "/"}},
|
||||
}
|
||||
|
||||
for _, tt := range table {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package stdos
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
|
@ -15,7 +16,7 @@ type File struct {
|
|||
*os.File
|
||||
info *pkging.FileInfo
|
||||
her here.Info
|
||||
path pkging.Path
|
||||
path here.Path
|
||||
pkging pkging.Pkger
|
||||
}
|
||||
|
||||
|
@ -25,6 +26,7 @@ func NewFile(fx pkging.Pkger, osf *os.File) (*File, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fmt.Println(">>>TODO pkging/stdos/file.go:29: pt ", pt)
|
||||
info, err := osf.Stat()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -82,7 +84,7 @@ func (f *File) Open(name string) (http.File, error) {
|
|||
return f2, nil
|
||||
}
|
||||
|
||||
func (f *File) Path() pkging.Path {
|
||||
func (f *File) Path() here.Path {
|
||||
return f.path
|
||||
}
|
||||
|
||||
|
|
|
@ -7,13 +7,16 @@ import (
|
|||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_File_Stat_No_Info(t *testing.T) {
|
||||
r := require.New(t)
|
||||
|
||||
pkg, err := New()
|
||||
her, err := here.Current()
|
||||
r.NoError(err)
|
||||
pkg, err := New(her)
|
||||
r.NoError(err)
|
||||
|
||||
f, err := pkg.Open(":/pkging/stdos/file_test.go")
|
||||
|
@ -35,7 +38,9 @@ func Test_File_Stat_No_Info(t *testing.T) {
|
|||
func Test_File_HTTP_Dir(t *testing.T) {
|
||||
r := require.New(t)
|
||||
|
||||
pkg, err := New()
|
||||
her, err := here.Current()
|
||||
r.NoError(err)
|
||||
pkg, err := New(her)
|
||||
r.NoError(err)
|
||||
|
||||
fp := filepath.Join("..", "..", "examples", "app", "public")
|
||||
|
|
|
@ -14,9 +14,8 @@ import (
|
|||
var _ pkging.Pkger = &Pkger{}
|
||||
|
||||
type Pkger struct {
|
||||
infos *maps.Infos
|
||||
paths *maps.Paths
|
||||
current here.Info
|
||||
Here here.Info
|
||||
infos *maps.Infos
|
||||
}
|
||||
|
||||
func (f *Pkger) Abs(p string) (string, error) {
|
||||
|
@ -27,9 +26,9 @@ func (f *Pkger) Abs(p string) (string, error) {
|
|||
return f.AbsPath(pt)
|
||||
}
|
||||
|
||||
func (f *Pkger) AbsPath(pt pkging.Path) (string, error) {
|
||||
if pt.Pkg == f.current.ImportPath {
|
||||
return filepath.Join(f.current.Dir, pt.Name), nil
|
||||
func (f *Pkger) AbsPath(pt here.Path) (string, error) {
|
||||
if pt.Pkg == f.Here.ImportPath {
|
||||
return filepath.Join(f.Here.Dir, pt.Name), nil
|
||||
}
|
||||
info, err := f.Info(pt.Pkg)
|
||||
if err != nil {
|
||||
|
@ -38,19 +37,12 @@ func (f *Pkger) AbsPath(pt pkging.Path) (string, error) {
|
|||
return filepath.Join(info.Dir, pt.Name), nil
|
||||
}
|
||||
|
||||
func New() (*Pkger, error) {
|
||||
info, err := here.Current()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
func New(her here.Info) (*Pkger, error) {
|
||||
p := &Pkger{
|
||||
infos: &maps.Infos{},
|
||||
paths: &maps.Paths{
|
||||
Current: info,
|
||||
},
|
||||
current: info,
|
||||
Here: her,
|
||||
}
|
||||
p.infos.Store(info.ImportPath, info)
|
||||
p.infos.Store(her.ImportPath, her)
|
||||
return p, nil
|
||||
}
|
||||
|
||||
|
@ -67,7 +59,7 @@ func (fx *Pkger) Create(name string) (pkging.File, error) {
|
|||
}
|
||||
|
||||
func (f *Pkger) Current() (here.Info, error) {
|
||||
return f.current, nil
|
||||
return f.Here, nil
|
||||
}
|
||||
|
||||
func (f *Pkger) Info(p string) (here.Info, error) {
|
||||
|
@ -104,8 +96,8 @@ func (fx *Pkger) Open(name string) (pkging.File, error) {
|
|||
return NewFile(fx, f)
|
||||
}
|
||||
|
||||
func (f *Pkger) Parse(p string) (pkging.Path, error) {
|
||||
return f.paths.Parse(p)
|
||||
func (f *Pkger) Parse(p string) (here.Path, error) {
|
||||
return f.Here.Parse(p)
|
||||
}
|
||||
|
||||
func (f *Pkger) Stat(name string) (os.FileInfo, error) {
|
||||
|
|
|
@ -4,24 +4,28 @@ import (
|
|||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
"github.com/markbates/pkger/pkging/pkgtest"
|
||||
)
|
||||
|
||||
func Test_Pkger(t *testing.T) {
|
||||
suite, err := pkgtest.NewSuite("stdos", func() (pkging.Pkger, error) {
|
||||
mypkging, err := New()
|
||||
her, err := here.Current()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dir, err := ioutil.TempDir("", "stdos")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mypkging.current.Dir = dir
|
||||
mypkging.paths.Current = mypkging.current
|
||||
her.Dir = dir
|
||||
|
||||
mypkging, err := New(her)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return mypkging, nil
|
||||
})
|
||||
|
|
|
@ -27,7 +27,7 @@ func (w withPkger) String() string {
|
|||
return fmt.Sprintf("%T > %T", w.base, w.parent)
|
||||
}
|
||||
|
||||
func (w withPkger) Parse(p string) (Path, error) {
|
||||
func (w withPkger) Parse(p string) (here.Path, error) {
|
||||
pt, err := w.base.Parse(p)
|
||||
if err != nil {
|
||||
if w.parent != nil {
|
||||
|
@ -49,7 +49,7 @@ func (w withPkger) Abs(p string) (string, error) {
|
|||
return pt, nil
|
||||
}
|
||||
|
||||
func (w withPkger) AbsPath(p Path) (string, error) {
|
||||
func (w withPkger) AbsPath(p here.Path) (string, error) {
|
||||
pt, err := w.base.AbsPath(p)
|
||||
if err != nil {
|
||||
if w.parent != nil {
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package stuffing
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/markbates/pkger/here"
|
||||
"github.com/markbates/pkger/pkging"
|
||||
|
@ -9,8 +11,8 @@ import (
|
|||
"github.com/markbates/pkger/pkging/stdos"
|
||||
)
|
||||
|
||||
func Stuff(w io.Writer, cur here.Info, paths []pkging.Path) error {
|
||||
disk, err := stdos.New()
|
||||
func Stuff(w io.Writer, cur here.Info, paths []here.Path) error {
|
||||
disk, err := stdos.New(cur)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -32,6 +34,10 @@ func Stuff(w io.Writer, cur here.Info, paths []pkging.Path) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
info := f.Info()
|
||||
fmt.Println(">>>TODO stuffing/stuffing.go:41: info.Dir ", info.Dir)
|
||||
fi = pkging.WithName(strings.TrimPrefix(fi.Name(), info.Dir), fi)
|
||||
fmt.Println(">>>TODO stuffing/stuffing.go:37: fi.Name() ", fi.Name())
|
||||
|
||||
if err := pkg.Add(fi, f); err != nil {
|
||||
return err
|
||||
|
|
Loading…
Reference in New Issue