From b559c3e88aa1430f370ad078b3af71575dfcf8d7 Mon Sep 17 00:00:00 2001
From: Jeromy <jeromyj@gmail.com>
Date: Mon, 28 Dec 2015 07:56:19 -0800
Subject: [PATCH] PutNode creates intermediary nodes

License: MIT
Signed-off-by: Jeromy <jeromyj@gmail.com>
---
 core/coreunix/add.go | 7 +++++++
 mfs/dir.go           | 4 +++-
 mfs/ops.go           | 5 ++++-
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/core/coreunix/add.go b/core/coreunix/add.go
index f045b9821..50aabd337 100644
--- a/core/coreunix/add.go
+++ b/core/coreunix/add.go
@@ -328,6 +328,13 @@ func (adder *Adder) addNode(node *dag.Node, path string) error {
 		path = key.Pretty()
 	}
 
+	dir := gopath.Dir(path)
+	if dir != "." {
+		if err := mfs.Mkdir(adder.mr, dir, true); err != nil {
+			return err
+		}
+	}
+
 	if err := mfs.PutNode(adder.mr, path, node); err != nil {
 		return err
 	}
diff --git a/mfs/dir.go b/mfs/dir.go
index 43271fe49..946d9e9a4 100644
--- a/mfs/dir.go
+++ b/mfs/dir.go
@@ -268,7 +268,9 @@ func (d *Directory) Mkdir(name string) (*Directory, error) {
 		return nil, err
 	}
 
-	return d.childDir(name)
+	dirobj := NewDirectory(d.ctx, name, ndir, d, d.dserv)
+	d.childDirs[name] = dirobj
+	return dirobj, nil
 }
 
 func (d *Directory) Unlink(name string) error {
diff --git a/mfs/ops.go b/mfs/ops.go
index fc36b2256..59c6e239b 100644
--- a/mfs/ops.go
+++ b/mfs/ops.go
@@ -116,7 +116,10 @@ func Mkdir(r *Root, pth string, parents bool) error {
 
 	if len(parts) == 0 {
 		// this will only happen on 'mkdir /'
-		return fmt.Errorf("cannot mkdir '%s'", pth)
+		if parents {
+			return nil
+		}
+		return fmt.Errorf("cannot create directory '/': Already exists")
 	}
 
 	cur := r.GetValue().(*Directory)
-- 
GitLab