提交 4f76e473 作者: Jeromy

a bit of cleanup

上级 9ab59e44
...@@ -11,6 +11,9 @@ import ( ...@@ -11,6 +11,9 @@ import (
ufspb "github.com/jbenet/go-ipfs/unixfs/pb" ufspb "github.com/jbenet/go-ipfs/unixfs/pb"
) )
var ErrNotYetImplemented = errors.New("not yet implemented")
var ErrInvalidChild = errors.New("invalid child node")
type Directory struct { type Directory struct {
fs *Filesystem fs *Filesystem
parent childCloser parent childCloser
...@@ -128,9 +131,9 @@ func (d *Directory) childFile(name string) (*file, error) { ...@@ -128,9 +131,9 @@ func (d *Directory) childFile(name string) (*file, error) {
d.files[name] = nfi d.files[name] = nfi
return nfi, nil return nfi, nil
case ufspb.Data_Metadata: case ufspb.Data_Metadata:
panic("NOT YET IMPLEMENTED") return nil, ErrNotYetImplemented
default: default:
panic("NO!") return nil, ErrInvalidChild
} }
} }
} }
...@@ -162,9 +165,9 @@ func (d *Directory) childDir(name string) (*Directory, error) { ...@@ -162,9 +165,9 @@ func (d *Directory) childDir(name string) (*Directory, error) {
case ufspb.Data_File: case ufspb.Data_File:
return nil, fmt.Errorf("%s is not a directory", name) return nil, fmt.Errorf("%s is not a directory", name)
case ufspb.Data_Metadata: case ufspb.Data_Metadata:
panic("NOT YET IMPLEMENTED") return nil, ErrNotYetImplemented
default: default:
panic("NO!") return nil, ErrInvalidChild
} }
} }
...@@ -247,7 +250,9 @@ func (d *Directory) Unlink(name string) error { ...@@ -247,7 +250,9 @@ func (d *Directory) Unlink(name string) error {
return d.parent.closeChild(d.name, d.node) return d.parent.closeChild(d.name, d.node)
} }
// RenameEntry renames the child by 'oldname' of this directory to 'newname'
func (d *Directory) RenameEntry(oldname, newname string) error { func (d *Directory) RenameEntry(oldname, newname string) error {
// Is the child a directory?
dir, err := d.childDir(oldname) dir, err := d.childDir(oldname)
if err == nil { if err == nil {
dir.name = newname dir.name = newname
...@@ -266,6 +271,7 @@ func (d *Directory) RenameEntry(oldname, newname string) error { ...@@ -266,6 +271,7 @@ func (d *Directory) RenameEntry(oldname, newname string) error {
return d.parent.closeChild(d.name, d.node) return d.parent.closeChild(d.name, d.node)
} }
// Is the child a file?
fi, err := d.childFile(oldname) fi, err := d.childFile(oldname)
if err == nil { if err == nil {
fi.name = newname fi.name = newname
...@@ -292,6 +298,7 @@ func (d *Directory) RenameEntry(oldname, newname string) error { ...@@ -292,6 +298,7 @@ func (d *Directory) RenameEntry(oldname, newname string) error {
return ErrNoSuch return ErrNoSuch
} }
// AddChild adds the node 'nd' under this directory giving it the name 'name'
func (d *Directory) AddChild(name string, nd *dag.Node) error { func (d *Directory) AddChild(name string, nd *dag.Node) error {
pbn, err := ft.FromBytes(nd.Data) pbn, err := ft.FromBytes(nd.Data)
if err != nil { if err != nil {
...@@ -318,7 +325,7 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { ...@@ -318,7 +325,7 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error {
} }
d.files[name] = nfi d.files[name] = nfi
default: default:
panic("invalid unixfs node") return ErrInvalidChild
} }
return d.parent.closeChild(d.name, d.node) return d.parent.closeChild(d.name, d.node)
} }
......
...@@ -4,7 +4,6 @@ import ( ...@@ -4,7 +4,6 @@ import (
"errors" "errors"
"io" "io"
"os" "os"
"sync"
chunk "github.com/jbenet/go-ipfs/importer/chunk" chunk "github.com/jbenet/go-ipfs/importer/chunk"
dag "github.com/jbenet/go-ipfs/merkledag" dag "github.com/jbenet/go-ipfs/merkledag"
...@@ -30,13 +29,11 @@ type file struct { ...@@ -30,13 +29,11 @@ type file struct {
name string name string
hasChanges bool hasChanges bool
// TODO: determine whether or not locking here is actually required...
lk sync.Mutex
mod *mod.DagModifier mod *mod.DagModifier
} }
func NewFile(name string, node *dag.Node, parent childCloser, fs *Filesystem) (*file, error) { func NewFile(name string, node *dag.Node, parent childCloser, fs *Filesystem) (*file, error) {
dmod, err := mod.NewDagModifier(context.TODO(), node, fs.dserv, fs.pins.GetManual(), chunk.DefaultSplitter) dmod, err := mod.NewDagModifier(context.Background(), node, fs.dserv, fs.pins.GetManual(), chunk.DefaultSplitter)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -50,21 +47,15 @@ func NewFile(name string, node *dag.Node, parent childCloser, fs *Filesystem) (* ...@@ -50,21 +47,15 @@ func NewFile(name string, node *dag.Node, parent childCloser, fs *Filesystem) (*
} }
func (fi *file) Write(b []byte) (int, error) { func (fi *file) Write(b []byte) (int, error) {
fi.lk.Lock()
defer fi.lk.Unlock()
fi.hasChanges = true fi.hasChanges = true
return fi.mod.Write(b) return fi.mod.Write(b)
} }
func (fi *file) Read(b []byte) (int, error) { func (fi *file) Read(b []byte) (int, error) {
fi.lk.Lock()
defer fi.lk.Unlock()
return fi.mod.Read(b) return fi.mod.Read(b)
} }
func (fi *file) Close() error { func (fi *file) Close() error {
fi.lk.Lock()
defer fi.lk.Unlock()
if fi.hasChanges { if fi.hasChanges {
err := fi.mod.Flush() err := fi.mod.Flush()
if err != nil { if err != nil {
...@@ -88,8 +79,6 @@ func (fi *file) Close() error { ...@@ -88,8 +79,6 @@ func (fi *file) Close() error {
} }
func (fi *file) Flush() error { func (fi *file) Flush() error {
fi.lk.Lock()
defer fi.lk.Unlock()
return fi.mod.Flush() return fi.mod.Flush()
} }
...@@ -101,33 +90,23 @@ func (fi *file) withMode(mode int) File { ...@@ -101,33 +90,23 @@ func (fi *file) withMode(mode int) File {
} }
func (fi *file) Seek(offset int64, whence int) (int64, error) { func (fi *file) Seek(offset int64, whence int) (int64, error) {
fi.lk.Lock()
defer fi.lk.Unlock()
return fi.mod.Seek(offset, whence) return fi.mod.Seek(offset, whence)
} }
func (fi *file) WriteAt(b []byte, at int64) (int, error) { func (fi *file) WriteAt(b []byte, at int64) (int, error) {
fi.lk.Lock()
defer fi.lk.Unlock()
fi.hasChanges = true fi.hasChanges = true
return fi.mod.WriteAt(b, at) return fi.mod.WriteAt(b, at)
} }
func (fi *file) Size() (int64, error) { func (fi *file) Size() (int64, error) {
fi.lk.Lock()
defer fi.lk.Unlock()
return fi.mod.Size() return fi.mod.Size()
} }
func (fi *file) GetNode() (*dag.Node, error) { func (fi *file) GetNode() (*dag.Node, error) {
fi.lk.Lock()
defer fi.lk.Unlock()
return fi.mod.GetNode() return fi.mod.GetNode()
} }
func (fi *file) Truncate(size int64) error { func (fi *file) Truncate(size int64) error {
fi.lk.Lock()
defer fi.lk.Unlock()
fi.hasChanges = true fi.hasChanges = true
return fi.mod.Truncate(size) return fi.mod.Truncate(size)
} }
......
...@@ -21,6 +21,8 @@ func testFS(t *testing.T, nd *core.IpfsNode) *Filesystem { ...@@ -21,6 +21,8 @@ func testFS(t *testing.T, nd *core.IpfsNode) *Filesystem {
return fs return fs
} }
// Test some basic operations
// testing in fuse/ipns is sufficient to prove this code works properly
func TestBasic(t *testing.T) { func TestBasic(t *testing.T) {
mock, err := core.NewMockNode() mock, err := core.NewMockNode()
if err != nil { if err != nil {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论