cmds2/add: temp fix for -r. horrible hack
This will be removed soon, just gets us past landing cmds2.
Juan Batiz-Benet committed
Nov 11, 2014 at 22:43 UTC
6faeee830098166c371640669ff8877d73fbe951
1 file changed
+104
-12
core/commands2/add.go
+104
-12
@@ -4,6 +4,9 @@ import (
4
"errors"
5
"fmt"
6
"io"
7
+ "io/ioutil"
8
+ "os"
9
+ "path/filepath"
10
11
cmds "github.com/jbenet/go-ipfs/commands"
12
core "github.com/jbenet/go-ipfs/core"
@@ -12,6 +15,7 @@ import (
15
"github.com/jbenet/go-ipfs/importer/chunk"
16
dag "github.com/jbenet/go-ipfs/merkledag"
17
pinning "github.com/jbenet/go-ipfs/pin"
18
+ ft "github.com/jbenet/go-ipfs/unixfs"
19
)
20
21
// Error indicating the max depth has been exceded.
@@ -26,7 +30,7 @@ var addCmd = &cmds.Command{
30
cmds.BoolOption("recursive", "r", "Must be specified when adding directories"),
31
},
32
Arguments: []cmds.Argument{
29
- cmds.FileArg("file", true, true, "The path to a file to be added to IPFS"),
33
+ cmds.StringArg("file", true, true, "The path to a file to be added to IPFS"),
34
},
35
Description: "Add an object to ipfs.",
36
Help: `Adds contents of <path> to ipfs. Use -r to add directories.
@@ -37,27 +41,115 @@ remains to be implemented.
41
Run: func(req cmds.Request) (interface{}, error) {
42
n := req.Context().Node
43
40
- readers, err := internal.CastToReaders(req.Arguments())
41
- if err != nil {
42
- return nil, err
44
+ // THIS IS A HORRIBLE HACK -- FIXME!!!
45
+ // see https://github.com/jbenet/go-ipfs/issues/309
46
+ var added []*Object
47
+
48
+ // returns the last one
49
+ addDagnodes := func(dns []*dag.Node) error {
50
+ for _, dn := range dns {
51
+ o, err := getOutput(dn)
52
+ if err != nil {
53
+ return err
54
+ }
55
+
56
+ added = append(added, o)
57
+ }
58
+ return nil
59
}
60
45
- dagnodes, err := add(n, readers)
46
- if err != nil {
47
- return nil, err
61
+ addFile := func(name string) (*dag.Node, error) {
62
+ f, err := os.Open(name)
63
+ if err != nil {
64
+ return nil, err
65
+ }
66
+ defer f.Close()
67
+
68
+ dns, err := add(n, []io.Reader{f})
69
+ if err != nil {
70
+ return nil, err
71
+ }
72
+
73
+ if err := addDagnodes(dns); err != nil {
74
+ return nil, err
75
+ }
76
+ return dns[len(dns)-1], nil // last dag node is the file.
77
}
78
50
- // TODO: include fs paths in output (will need a way to specify paths in underlying filearg system)
51
- added := make([]*Object, 0, len(req.Arguments()))
52
- for _, dagnode := range dagnodes {
53
- object, err := getOutput(dagnode)
79
+ var addPath func(name string) (*dag.Node, error)
80
+ addDir := func(name string) (*dag.Node, error) {
81
+ tree := &dag.Node{Data: ft.FolderPBData()}
82
+
83
+ entries, err := ioutil.ReadDir(name)
84
if err != nil {
85
return nil, err
86
}
87
58
- added = append(added, object)
88
+ // construct nodes for containing files.
89
+ for _, e := range entries {
90
+ fp := filepath.Join(name, e.Name())
91
+ nd, err := addPath(fp)
92
+ if err != nil {
93
+ return nil, err
94
+ }
95
+
96
+ if err = tree.AddNodeLink(e.Name(), nd); err != nil {
97
+ return nil, err
98
+ }
99
+ }
100
+
101
+ log.Infof("adding dir: %s", name)
102
+
103
+ if err := addDagnodes([]*dag.Node{tree}); err != nil {
104
+ return nil, err
105
+ }
106
+ return tree, nil
107
+ }
108
+
109
+ addPath = func(fpath string) (*dag.Node, error) {
110
+ fi, err := os.Stat(fpath)
111
+ if err != nil {
112
+ return nil, err
113
+ }
114
+
115
+ if fi.IsDir() {
116
+ return addDir(fpath)
117
+ }
118
+ return addFile(fpath)
119
}
120
121
+ paths, err := internal.CastToStrings(req.Arguments())
122
+ if err != nil {
123
+ return nil, err
124
+ }
125
+
126
+ for _, f := range paths {
127
+ if _, err := addPath(f); err != nil {
128
+ return nil, err
129
+ }
130
+ }
131
+
132
+ // readers, err := internal.CastToReaders(req.Arguments())
133
+ // if err != nil {
134
+ // return nil, err
135
+ // }
136
+ //
137
+ // dagnodes, err := add(n, readers)
138
+ // if err != nil {
139
+ // return nil, err
140
+ // }
141
+ //
142
+ // // TODO: include fs paths in output (will need a way to specify paths in underlying filearg system)
143
+ // added := make([]*Object, 0, len(req.Arguments()))
144
+ // for _, dagnode := range dagnodes {
145
+ // object, err := getOutput(dagnode)
146
+ // if err != nil {
147
+ // return nil, err
148
+ // }
149
+ //
150
+ // added = append(added, object)
151
+ // }
152
+
153
return &AddOutput{added}, nil
154
},
155
Marshallers: map[cmds.EncodingType]cmds.Marshaller{