提交 4f76e473 作者: Jeromy

a bit of cleanup

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