Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 643400a

Browse files
committedAug 9, 2015
break commands/mfs code into mfs package
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
1 parent 3d4c91d commit 643400a

File tree

2 files changed

+123
-101
lines changed

2 files changed

+123
-101
lines changed
 

‎core/commands/mfs.go

+9-101
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ Mfs is an API for manipulating ipfs objects as if they were a unix filesystem.
3131
They can be seeded with an initial root hash, or by default are an empty directory.
3232
3333
NOTICE:
34-
This API is currently experimental and likely to change and may potentially be
34+
This API is currently experimental, likely to change, and may potentially be
3535
unstable. This notice will be removed when that is no longer the case. Feedback
36-
on how this API could be better is very welcome.
36+
on how this API could be improved is very welcome.
3737
`,
3838
},
3939
Options: []cmds.Option{
@@ -383,34 +383,14 @@ given mfs filesystem.
383383
}
384384

385385
path := req.Arguments()[1]
386-
err = PutNodeUnderRoot(root, path, nd)
386+
err = mfs.PutNodeUnderRoot(root, path, nd)
387387
if err != nil {
388388
res.SetError(err, cmds.ErrNormal)
389389
return
390390
}
391391
},
392392
}
393393

394-
func PutNodeUnderRoot(root *mfs.Root, ipath string, nd *dag.Node) error {
395-
dir, ok := root.GetValue().(*mfs.Directory)
396-
if !ok {
397-
return errors.New("root did not point to directory")
398-
}
399-
dirp, filename := gopath.Split(ipath)
400-
401-
parent, err := mfs.DirLookup(dir, dirp)
402-
if err != nil {
403-
return fmt.Errorf("lookup '%s' failed: %s", dirp, err)
404-
}
405-
406-
pdir, ok := parent.(*mfs.Directory)
407-
if !ok {
408-
return fmt.Errorf("%s did not point to directory", dirp)
409-
}
410-
411-
return pdir.AddChild(filename, nd)
412-
}
413-
414394
var MfsReadCmd = &cmds.Command{
415395
Helptext: cmds.HelpText{
416396
Tagline: "Read a file in a given mfs",
@@ -528,55 +508,12 @@ Example:
528508

529509
src := req.Arguments()[0]
530510
dst := req.Arguments()[1]
531-
srcDir, srcFname := gopath.Split(src)
532-
533-
srcObj, err := mfs.DirLookup(rdir, src)
534-
if err != nil {
535-
res.SetError(err, cmds.ErrNormal)
536-
return
537-
}
538-
539-
var dstDirStr string
540-
var filename string
541-
if dst[len(dst)-1] == '/' {
542-
dstDirStr = dst
543-
filename = srcFname
544-
} else {
545-
dstDirStr, filename = gopath.Split(dst)
546-
}
547-
548-
dstDiri, err := mfs.DirLookup(rdir, dstDirStr)
549-
if err != nil {
550-
res.SetError(err, cmds.ErrNormal)
551-
return
552-
}
553-
554-
dstDir := dstDiri.(*mfs.Directory)
555-
nd, err := srcObj.GetNode()
556-
if err != nil {
557-
res.SetError(err, cmds.ErrNormal)
558-
return
559-
}
560511

561-
err = dstDir.AddChild(filename, nd)
512+
err = mfs.Mv(rdir, src, dst)
562513
if err != nil {
563514
res.SetError(err, cmds.ErrNormal)
564515
return
565516
}
566-
567-
srcDirObji, err := mfs.DirLookup(rdir, srcDir)
568-
if err != nil {
569-
res.SetError(err, cmds.ErrNormal)
570-
return
571-
}
572-
573-
srcDirObj := srcDirObji.(*mfs.Directory)
574-
err = srcDirObj.Unlink(srcFname)
575-
if err != nil {
576-
res.SetError(err, cmds.ErrNormal)
577-
return
578-
}
579-
580517
},
581518
}
582519

@@ -709,8 +646,8 @@ func getFileHandle(root *mfs.Root, path string, create bool) (*mfs.File, error)
709646

710647
var MfsMkdirCmd = &cmds.Command{
711648
Helptext: cmds.HelpText{
712-
Tagline: "create a new directory",
713-
ShortDescription: ``,
649+
Tagline: "make directories",
650+
ShortDescription: `Create the directory if it does not already exist`,
714651
},
715652

716653
Arguments: []cmds.Argument{
@@ -749,39 +686,10 @@ var MfsMkdirCmd = &cmds.Command{
749686

750687
dirtomake := req.Arguments()[0]
751688

752-
parts := strings.Split(dirtomake, "/")
753-
if parts[0] == "" {
754-
parts = parts[1:]
755-
}
756-
757-
cur := rootdir
758-
for i, d := range parts[:len(parts)-1] {
759-
fsn, err := cur.Child(d)
760-
if err != nil {
761-
if err == os.ErrNotExist && dashp {
762-
mkd, err := cur.Mkdir(d)
763-
if err != nil {
764-
res.SetError(err, cmds.ErrNormal)
765-
return
766-
}
767-
fsn = mkd
768-
}
769-
}
770-
771-
next, ok := fsn.(*mfs.Directory)
772-
if !ok {
773-
res.SetError(fmt.Errorf("%s was not a directory", strings.Join(parts[:i], "/")), cmds.ErrNormal)
774-
return
775-
}
776-
cur = next
777-
}
778-
779-
_, err = cur.Mkdir(parts[len(parts)-1])
689+
err = mfs.Mkdir(rootdir, dirtomake, dashp)
780690
if err != nil {
781-
if !dashp || err != os.ErrExist {
782-
res.SetError(err, cmds.ErrNormal)
783-
return
784-
}
691+
res.SetError(err, cmds.ErrNormal)
692+
return
785693
}
786694
},
787695
}

‎mfs/ops.go

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package mfs
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
gopath "path"
8+
"strings"
9+
10+
dag "github.com/ipfs/go-ipfs/merkledag"
11+
)
12+
13+
func Mv(rootd *Directory, src, dst string) error {
14+
srcDir, srcFname := gopath.Split(src)
15+
16+
srcObj, err := DirLookup(rootd, src)
17+
if err != nil {
18+
return err
19+
}
20+
21+
var dstDirStr string
22+
var filename string
23+
if dst[len(dst)-1] == '/' {
24+
dstDirStr = dst
25+
filename = srcFname
26+
} else {
27+
dstDirStr, filename = gopath.Split(dst)
28+
}
29+
30+
dstDiri, err := DirLookup(rootd, dstDirStr)
31+
if err != nil {
32+
return err
33+
}
34+
35+
dstDir := dstDiri.(*Directory)
36+
nd, err := srcObj.GetNode()
37+
if err != nil {
38+
return err
39+
}
40+
41+
err = dstDir.AddChild(filename, nd)
42+
if err != nil {
43+
return err
44+
}
45+
46+
srcDirObji, err := DirLookup(rootd, srcDir)
47+
if err != nil {
48+
return err
49+
}
50+
51+
srcDirObj := srcDirObji.(*Directory)
52+
err = srcDirObj.Unlink(srcFname)
53+
if err != nil {
54+
return err
55+
}
56+
57+
return nil
58+
}
59+
60+
func PutNodeUnderRoot(root *Root, ipath string, nd *dag.Node) error {
61+
dir, ok := root.GetValue().(*Directory)
62+
if !ok {
63+
return errors.New("root did not point to directory")
64+
}
65+
dirp, filename := gopath.Split(ipath)
66+
67+
parent, err := DirLookup(dir, dirp)
68+
if err != nil {
69+
return fmt.Errorf("lookup '%s' failed: %s", dirp, err)
70+
}
71+
72+
pdir, ok := parent.(*Directory)
73+
if !ok {
74+
return fmt.Errorf("%s did not point to directory", dirp)
75+
}
76+
77+
return pdir.AddChild(filename, nd)
78+
}
79+
80+
func Mkdir(rootd *Directory, path string, parents bool) error {
81+
parts := strings.Split(path, "/")
82+
if parts[0] == "" {
83+
parts = parts[1:]
84+
}
85+
86+
cur := rootd
87+
for i, d := range parts[:len(parts)-1] {
88+
fsn, err := cur.Child(d)
89+
if err != nil {
90+
if err == os.ErrNotExist && parents {
91+
mkd, err := cur.Mkdir(d)
92+
if err != nil {
93+
return err
94+
}
95+
fsn = mkd
96+
}
97+
}
98+
99+
next, ok := fsn.(*Directory)
100+
if !ok {
101+
return fmt.Errorf("%s was not a directory", strings.Join(parts[:i], "/"))
102+
}
103+
cur = next
104+
}
105+
106+
_, err := cur.Mkdir(parts[len(parts)-1])
107+
if err != nil {
108+
if !parents || err != os.ErrExist {
109+
return err
110+
}
111+
}
112+
113+
return nil
114+
}

0 commit comments

Comments
 (0)
Please sign in to comment.