From d29930c03193291a51fcae56f8cfde404018ff76 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 8 Sep 2017 21:00:55 -0400 Subject: [PATCH] Eliminate Prefix field from MFS root, use MkdirOpts. License: MIT Signed-off-by: Kevin Atkinson --- core/commands/files/files.go | 13 +++++-------- core/coreunix/add.go | 14 +++++++++++--- mfs/mfs_test.go | 4 ++-- mfs/ops.go | 26 +++++++++++++++++--------- mfs/system.go | 3 --- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/core/commands/files/files.go b/core/commands/files/files.go index 645f24aa8..a39a0767b 100644 --- a/core/commands/files/files.go +++ b/core/commands/files/files.go @@ -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 diff --git a/core/coreunix/add.go b/core/coreunix/add.go index 9617fc46c..eca42b0a8 100644 --- a/core/coreunix/add.go +++ b/core/coreunix/add.go @@ -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 } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 09e9de00d..bebfa8d30 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -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) } diff --git a/mfs/ops.go b/mfs/ops.go index 5b72adcad..49ce398d4 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -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 diff --git a/mfs/system.go b/mfs/system.go index 0641704cf..fc5be0f6e 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -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