forked from mirror/pkger
guarded by monkeys
This commit is contained in:
parent
5e24d43bb0
commit
6463dbba07
|
@ -9,7 +9,7 @@ import (
|
|||
|
||||
type File interface {
|
||||
Close() error
|
||||
FilePath() string
|
||||
Abs() (string, error)
|
||||
Info() here.Info
|
||||
Name() string
|
||||
Open(name string) (http.File, error)
|
||||
|
|
3
fs/fs.go
3
fs/fs.go
|
@ -9,6 +9,9 @@ import (
|
|||
|
||||
type FileSystem interface {
|
||||
Parse(p string) (Path, error)
|
||||
Abs(string) (string, error)
|
||||
AbsPath(Path) (string, error)
|
||||
|
||||
Current() (here.Info, error)
|
||||
Info(p string) (here.Info, error)
|
||||
|
||||
|
|
|
@ -196,7 +196,6 @@ func (s *FileSystem) Test_Stat(t *testing.T) {
|
|||
pt, err := s.Parse(tt.in)
|
||||
r.NoError(err)
|
||||
|
||||
r.Fail(pt.String())
|
||||
f, err := s.Create(tt.in)
|
||||
r.NoError(err)
|
||||
_, err = io.Copy(f, strings.NewReader("!"+pt.String()))
|
||||
|
|
|
@ -3,7 +3,6 @@ package hdfs
|
|||
import (
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/markbates/pkger/fs"
|
||||
"github.com/markbates/pkger/here"
|
||||
|
@ -13,7 +12,6 @@ var _ fs.File = &File{}
|
|||
|
||||
type File struct {
|
||||
*os.File
|
||||
filePath string
|
||||
info *fs.FileInfo
|
||||
her here.Info
|
||||
path fs.Path
|
||||
|
@ -22,13 +20,10 @@ type File struct {
|
|||
|
||||
func NewFile(fx fs.FileSystem, osf *os.File) (*File, error) {
|
||||
|
||||
cur, err := fx.Current()
|
||||
pt, err := fx.Parse(osf.Name())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pt := fs.Path{
|
||||
Name: strings.TrimPrefix(osf.Name(), cur.Dir),
|
||||
}
|
||||
|
||||
info, err := osf.Stat()
|
||||
if err != nil {
|
||||
|
@ -37,7 +32,6 @@ func NewFile(fx fs.FileSystem, osf *os.File) (*File, error) {
|
|||
|
||||
f := &File{
|
||||
File: osf,
|
||||
filePath: info.Name(),
|
||||
path: pt,
|
||||
fs: fx,
|
||||
}
|
||||
|
@ -55,8 +49,8 @@ func (f *File) Close() error {
|
|||
return f.File.Close()
|
||||
}
|
||||
|
||||
func (f *File) FilePath() string {
|
||||
return f.filePath
|
||||
func (f *File) Abs() (string, error) {
|
||||
return f.fs.AbsPath(f.path)
|
||||
}
|
||||
|
||||
func (f *File) Info() here.Info {
|
||||
|
@ -76,12 +70,19 @@ func (f *File) Path() fs.Path {
|
|||
}
|
||||
|
||||
func (f *File) Stat() (os.FileInfo, error) {
|
||||
if f.info == nil {
|
||||
info, err := os.Stat(f.filePath)
|
||||
if f.info != nil {
|
||||
return f.info, nil
|
||||
}
|
||||
|
||||
abs, err := f.Abs()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info, err := os.Stat(abs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
f.info = fs.NewFileInfo(info)
|
||||
}
|
||||
return f.info, nil
|
||||
return info, nil
|
||||
}
|
||||
|
|
|
@ -20,6 +20,25 @@ type FS struct {
|
|||
current here.Info
|
||||
}
|
||||
|
||||
func (f *FS) Abs(p string) (string, error) {
|
||||
pt, err := f.Parse(p)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return f.AbsPath(pt)
|
||||
}
|
||||
|
||||
func (f *FS) AbsPath(pt fs.Path) (string, error) {
|
||||
if pt.Pkg == f.current.ImportPath {
|
||||
return filepath.Join(f.current.Dir, pt.Name), nil
|
||||
}
|
||||
info, err := f.Info(pt.Pkg)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return filepath.Join(info.Dir, pt.Name), nil
|
||||
}
|
||||
|
||||
func New() (*FS, error) {
|
||||
info, err := here.Current()
|
||||
if err != nil {
|
||||
|
@ -35,7 +54,7 @@ func New() (*FS, error) {
|
|||
}
|
||||
|
||||
func (fx *FS) Create(name string) (fs.File, error) {
|
||||
name, err := fx.locate(name)
|
||||
name, err := fx.Abs(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -68,7 +87,7 @@ func (f *FS) Info(p string) (here.Info, error) {
|
|||
}
|
||||
|
||||
func (f *FS) MkdirAll(p string, perm os.FileMode) error {
|
||||
p, err := f.locate(p)
|
||||
p, err := f.Abs(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -76,7 +95,7 @@ func (f *FS) MkdirAll(p string, perm os.FileMode) error {
|
|||
}
|
||||
|
||||
func (fx *FS) Open(name string) (fs.File, error) {
|
||||
name, err := fx.locate(name)
|
||||
name, err := fx.Abs(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -92,7 +111,7 @@ func (f *FS) Parse(p string) (fs.Path, error) {
|
|||
}
|
||||
|
||||
func (f *FS) ReadFile(s string) ([]byte, error) {
|
||||
s, err := f.locate(s)
|
||||
s, err := f.Abs(s)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -100,7 +119,7 @@ func (f *FS) ReadFile(s string) ([]byte, error) {
|
|||
}
|
||||
|
||||
func (f *FS) Stat(name string) (os.FileInfo, error) {
|
||||
name, err := f.locate(name)
|
||||
name, err := f.Abs(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -108,7 +127,7 @@ func (f *FS) Stat(name string) (os.FileInfo, error) {
|
|||
}
|
||||
|
||||
func (f *FS) Walk(p string, wf filepath.WalkFunc) error {
|
||||
fp, err := f.locate(p)
|
||||
fp, err := f.Abs(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -133,17 +152,8 @@ func (f *FS) Walk(p string, wf filepath.WalkFunc) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (f *FS) locate(p string) (string, error) {
|
||||
pt, err := f.Parse(p)
|
||||
if err != nil {
|
||||
return p, err
|
||||
}
|
||||
p = f.current.FilePath(pt.Name)
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (fx *FS) Remove(name string) error {
|
||||
name, err := fx.locate(name)
|
||||
name, err := fx.Abs(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -151,7 +161,7 @@ func (fx *FS) Remove(name string) error {
|
|||
}
|
||||
|
||||
func (fx *FS) RemoveAll(name string) error {
|
||||
name, err := fx.locate(name)
|
||||
name, err := fx.Abs(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -98,8 +98,8 @@ func (f File) Name() string {
|
|||
return f.info.Name()
|
||||
}
|
||||
|
||||
func (f File) FilePath() string {
|
||||
return f.her.FilePath(f.Name())
|
||||
func (f File) Abs() (string, error) {
|
||||
return f.fs.AbsPath(f.Path())
|
||||
}
|
||||
|
||||
func (f File) Path() fs.Path {
|
||||
|
|
|
@ -38,6 +38,18 @@ type FS struct {
|
|||
current here.Info
|
||||
}
|
||||
|
||||
func (f *FS) Abs(p string) (string, error) {
|
||||
pt, err := f.Parse(p)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return f.AbsPath(pt)
|
||||
}
|
||||
|
||||
func (f *FS) AbsPath(pt fs.Path) (string, error) {
|
||||
return pt.String(), nil
|
||||
}
|
||||
|
||||
func (f *FS) Current() (here.Info, error) {
|
||||
return f.current, nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue