1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-06-26 15:42:21 +08:00

code cleanup

This commit is contained in:
Jeromy
2015-03-15 00:14:57 -07:00
parent 0718bd73a7
commit 0ee7091cbc
3 changed files with 86 additions and 129 deletions

View File

@ -60,7 +60,7 @@ func (d *Directory) Open(tpath []string, mode int) (*File, error) {
return nfi, nil return nfi, nil
} }
return nil, ErrNoSuch return nil, os.ErrNotExist
} }
dir, err := d.childDir(tpath[0]) dir, err := d.childDir(tpath[0])
@ -99,16 +99,14 @@ func (d *Directory) Type() NodeType {
return TDir return TDir
} }
// childFile returns a file under this directory by the given name if it exists
func (d *Directory) childFile(name string) (*File, error) { func (d *Directory) childFile(name string) (*File, error) {
fi, ok := d.files[name] fi, ok := d.files[name]
if ok { if ok {
return fi, nil return fi, nil
} }
// search dag nd, err := d.childFromDag(name)
for _, lnk := range d.node.Links {
if lnk.Name == name {
nd, err := lnk.GetNode(d.fs.dserv)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -132,23 +130,21 @@ func (d *Directory) childFile(name string) (*File, error) {
default: default:
return nil, ErrInvalidChild return nil, ErrInvalidChild
} }
}
}
return nil, ErrNoSuch
} }
// childDir returns a directory under this directory by the given name if it
// exists.
func (d *Directory) childDir(name string) (*Directory, error) { func (d *Directory) childDir(name string) (*Directory, error) {
dir, ok := d.childDirs[name] dir, ok := d.childDirs[name]
if ok { if ok {
return dir, nil return dir, nil
} }
for _, lnk := range d.node.Links { nd, err := d.childFromDag(name)
if lnk.Name == name {
nd, err := lnk.GetNode(d.fs.dserv)
if err != nil { if err != nil {
return nil, err return nil, err
} }
i, err := ft.FromBytes(nd.Data) i, err := ft.FromBytes(nd.Data)
if err != nil { if err != nil {
return nil, err return nil, err
@ -166,19 +162,29 @@ func (d *Directory) childDir(name string) (*Directory, error) {
default: default:
return nil, ErrInvalidChild return nil, ErrInvalidChild
} }
}
}
return nil, ErrNoSuch
} }
// childFromDag searches through this directories dag node for a child link
// with the given name
func (d *Directory) childFromDag(name string) (*dag.Node, error) {
for _, lnk := range d.node.Links {
if lnk.Name == name {
return lnk.GetNode(d.fs.dserv)
}
}
return nil, os.ErrNotExist
}
// Child returns the child of this directory by the given name
func (d *Directory) Child(name string) (FSNode, error) { func (d *Directory) Child(name string) (FSNode, error) {
d.lock.Lock() d.lock.Lock()
defer d.lock.Unlock() defer d.lock.Unlock()
return d.childUnsync(name) return d.childUnsync(name)
} }
// childUnsync returns the child under this directory by the given name
// without locking, useful for operations which already hold a lock
func (d *Directory) childUnsync(name string) (FSNode, error) { func (d *Directory) childUnsync(name string) (FSNode, error) {
dir, err := d.childDir(name) dir, err := d.childDir(name)
if err == nil { if err == nil {
@ -189,7 +195,7 @@ func (d *Directory) childUnsync(name string) (FSNode, error) {
return fi, nil return fi, nil
} }
return nil, ErrNoSuch return nil, os.ErrNotExist
} }
func (d *Directory) List() []string { func (d *Directory) List() []string {
@ -245,56 +251,6 @@ 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 {
d.Lock()
defer d.Unlock()
// Is the child a directory?
dir, err := d.childDir(oldname)
if err == nil {
dir.name = newname
err := d.node.RemoveNodeLink(oldname)
if err != nil {
return err
}
err = d.node.AddNodeLinkClean(newname, dir.node)
if err != nil {
return err
}
delete(d.childDirs, oldname)
d.childDirs[newname] = dir
return d.parent.closeChild(d.name, d.node)
}
// Is the child a file?
fi, err := d.childFile(oldname)
if err == nil {
fi.name = newname
err := d.node.RemoveNodeLink(oldname)
if err != nil {
return err
}
nd, err := fi.GetNode()
if err != nil {
return err
}
err = d.node.AddNodeLinkClean(newname, nd)
if err != nil {
return err
}
delete(d.childDirs, oldname)
d.files[newname] = fi
return d.parent.closeChild(d.name, d.node)
}
return ErrNoSuch
}
// AddChild adds the node 'nd' under this directory giving it the name 'name' // 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 {
d.Lock() d.Lock()

View File

@ -36,19 +36,21 @@ 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.Lock()
defer fi.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.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.Unlock()
return fi.mod.Read(b) return fi.mod.Read(b)
} }
func (fi *File) Close() error { func (fi *File) Close() error {
fi.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.Unlock()
if fi.hasChanges { if fi.hasChanges {
err := fi.mod.Flush() err := fi.mod.Flush()
if err != nil { if err != nil {
@ -60,9 +62,9 @@ func (fi *File) Close() error {
return err return err
} }
fi.lock.Unlock() fi.Unlock()
err = fi.parent.closeChild(fi.name, nd) err = fi.parent.closeChild(fi.name, nd)
fi.lock.Lock() fi.Lock()
if err != nil { if err != nil {
return err return err
} }
@ -74,39 +76,39 @@ func (fi *File) Close() error {
} }
func (fi *File) Flush() error { func (fi *File) Flush() error {
fi.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.Unlock()
return fi.mod.Flush() return fi.mod.Flush()
} }
func (fi *File) Seek(offset int64, whence int) (int64, error) { func (fi *File) Seek(offset int64, whence int) (int64, error) {
fi.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.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.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.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.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.Unlock()
return fi.mod.Size() return fi.mod.Size()
} }
func (fi *File) GetNode() (*dag.Node, error) { func (fi *File) GetNode() (*dag.Node, error) {
fi.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.Unlock()
return fi.mod.GetNode() return fi.mod.GetNode()
} }
func (fi *File) Truncate(size int64) error { func (fi *File) Truncate(size int64) error {
fi.lock.Lock() fi.Lock()
defer fi.lock.Unlock() defer fi.Unlock()
fi.hasChanges = true fi.hasChanges = true
return fi.mod.Truncate(size) return fi.mod.Truncate(size)
} }

View File

@ -3,6 +3,7 @@ package ipnsfs
import ( import (
"errors" "errors"
"fmt" "fmt"
"os"
"strings" "strings"
"time" "time"
@ -21,8 +22,6 @@ var log = eventlog.Logger("ipnsfs")
var ErrIsDirectory = errors.New("error: is a directory") var ErrIsDirectory = errors.New("error: is a directory")
var ErrNoSuch = errors.New("no such file or directory")
// Filesystem is the writeable fuse filesystem structure // Filesystem is the writeable fuse filesystem structure
type Filesystem struct { type Filesystem struct {
dserv dag.DAGService dserv dag.DAGService
@ -62,7 +61,7 @@ func (fs *Filesystem) Open(tpath string, mode int) (*File, error) {
pathelem := strings.Split(tpath, "/") pathelem := strings.Split(tpath, "/")
r, ok := fs.roots[pathelem[0]] r, ok := fs.roots[pathelem[0]]
if !ok { if !ok {
return nil, ErrNoSuch return nil, os.ErrNotExist
} }
return r.Open(pathelem[1:], mode) return r.Open(pathelem[1:], mode)
@ -83,7 +82,7 @@ func (fs *Filesystem) GetRoot(name string) (*KeyRoot, error) {
if ok { if ok {
return r, nil return r, nil
} }
return nil, ErrNoSuch return nil, os.ErrNotExist
} }
type NodeType int type NodeType int