Eliminate Prefix field from MFS root, use MkdirOpts.

License: MIT
Signed-off-by: Kevin Atkinson <k@kevina.org>
This commit is contained in:
Kevin Atkinson 2017-09-08 21:00:55 -04:00
parent fd7b72fa16
commit d29930c031
5 changed files with 35 additions and 25 deletions

View File

@ -746,15 +746,12 @@ Examples:
return
}
root := n.FilesRoot
if prefix != nil {
// FIXME: This is ugly and may not be correct either
// -- kevina
newRoot := *root
root = &newRoot
root.Prefix = prefix
}
err = mfs.Mkdir(root, dirtomake, dashp, flush)
err = mfs.Mkdir(root, dirtomake, mfs.MkdirOpts{
Mkparents: dashp,
Flush: flush,
Prefix: prefix,
})
if err != nil {
res.SetError(err, cmds.ErrNormal)
return

View File

@ -119,7 +119,6 @@ func (adder *Adder) mfsRoot() (*mfs.Root, error) {
rnode := unixfs.EmptyDirNode()
rnode.SetPrefix(adder.Prefix)
mr, err := mfs.NewRoot(adder.ctx, adder.dagService, rnode, nil)
mr.Prefix = adder.Prefix
if err != nil {
return nil, err
}
@ -398,7 +397,12 @@ func (adder *Adder) addNode(node node.Node, path string) error {
}
dir := gopath.Dir(path)
if dir != "." {
if err := mfs.Mkdir(mr, dir, true, false); err != nil {
opts := mfs.MkdirOpts{
Mkparents: true,
Flush: false,
Prefix: adder.Prefix,
}
if err := mfs.Mkdir(mr, dir, opts); err != nil {
return err
}
}
@ -496,7 +500,11 @@ func (adder *Adder) addDir(dir files.File) error {
if err != nil {
return err
}
err = mfs.Mkdir(mr, dir.FileName(), true, false)
err = mfs.Mkdir(mr, dir.FileName(), mfs.MkdirOpts{
Mkparents: true,
Flush: false,
Prefix: adder.Prefix,
})
if err != nil {
return err
}

View File

@ -735,7 +735,7 @@ func TestMfsHugeDir(t *testing.T) {
_, rt := setupRoot(ctx, t)
for i := 0; i < 10000; i++ {
err := Mkdir(rt, fmt.Sprintf("/dir%d", i), false, false)
err := Mkdir(rt, fmt.Sprintf("/dir%d", i), MkdirOpts{Mkparents: false, Flush: false})
if err != nil {
t.Fatal(err)
}
@ -747,7 +747,7 @@ func TestMkdirP(t *testing.T) {
defer cancel()
_, rt := setupRoot(ctx, t)
err := Mkdir(rt, "/a/b/c/d/e/f", true, true)
err := Mkdir(rt, "/a/b/c/d/e/f", MkdirOpts{Mkparents: true, Flush: true})
if err != nil {
t.Fatal(err)
}

View File

@ -9,6 +9,7 @@ import (
path "github.com/ipfs/go-ipfs/path"
cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid"
node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format"
)
@ -97,9 +98,16 @@ func PutNode(r *Root, path string, nd node.Node) error {
return pdir.AddChild(filename, nd)
}
// MkdirOpts is used by Mkdir
type MkdirOpts struct {
Mkparents bool
Flush bool
Prefix *cid.Prefix
}
// Mkdir creates a directory at 'path' under the directory 'd', creating
// intermediary directories as needed if 'mkparents' is set to true
func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
func Mkdir(r *Root, pth string, opts MkdirOpts) error {
if pth == "" {
return fmt.Errorf("no path given to Mkdir")
}
@ -115,7 +123,7 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
if len(parts) == 0 {
// this will only happen on 'mkdir /'
if mkparents {
if opts.Mkparents {
return nil
}
return fmt.Errorf("cannot create directory '/': Already exists")
@ -124,13 +132,13 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
cur := r.GetValue().(*Directory)
for i, d := range parts[:len(parts)-1] {
fsn, err := cur.Child(d)
if err == os.ErrNotExist && mkparents {
if err == os.ErrNotExist && opts.Mkparents {
mkd, err := cur.Mkdir(d)
if err != nil {
return err
}
if r.Prefix != nil {
mkd.SetPrefix(r.Prefix)
if opts.Prefix != nil {
mkd.SetPrefix(opts.Prefix)
}
fsn = mkd
} else if err != nil {
@ -146,15 +154,15 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
final, err := cur.Mkdir(parts[len(parts)-1])
if err != nil {
if !mkparents || err != os.ErrExist || final == nil {
if !opts.Mkparents || err != os.ErrExist || final == nil {
return err
}
}
if r.Prefix != nil {
final.SetPrefix(r.Prefix)
if opts.Prefix != nil {
final.SetPrefix(opts.Prefix)
}
if flush {
if opts.Flush {
err := final.Flush()
if err != nil {
return err

View File

@ -61,9 +61,6 @@ type Root struct {
dserv dag.DAGService
Type string
// Prefix to use for any children created
Prefix *cid.Prefix
}
type PubFunc func(context.Context, *cid.Cid) error