add -w improvement: wrap multiple files in one dir
> ipfs add a b c added Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 a added QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM b added QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 c added QmXg3WHLcjnz4ejeYF6FKVBkb4m1oKjQmF5fEWL9M1uQF3 > ipfs ls QmXg3WHLcjnz4ejeYF6FKVBkb4m1oKjQmF5fEWL9M1uQF3 Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 10 a QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM 10 b QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 10 c License: MIT Signed-off-by: Juan Batiz-Benet <juan@benet.ai>
Juan Batiz-Benet committed
Jul 29, 2015 at 03:07 UTC
4a7c1cf802d069f59e25f0d057d0b19997449612
2 files changed
+54
-37
commands/files/multipartfile.go
+4
@@ -68,6 +68,10 @@ func (f *MultipartFile) NextFile() (File, error) {
68
}
69
70
func (f *MultipartFile) FileName() string {
71
+ if f == nil || f.Part == nil {
72
+ return ""
73
+ }
74
+
75
filename, err := url.QueryUnescape(f.Part.FileName())
76
if err != nil {
77
// if there is a unescape error, just treat the name as unescaped
core/commands/add.go
+50
-37
@@ -110,52 +110,65 @@ remains to be implemented.
110
outChan := make(chan interface{}, 8)
111
res.SetOutput((<-chan interface{})(outChan))
112
113
- go func() {
114
- defer close(outChan)
113
+ // addSingleFile is a function that adds a file given as a param.
114
+ addSingleFile := func(file files.File) error {
115
+ addParams := adder{
116
+ node: n,
117
+ out: outChan,
118
+ progress: progress,
119
+ hidden: hidden,
120
+ trickle: trickle,
121
+ }
122
116
- for {
117
- file, err := req.Files().NextFile()
118
- if err != nil && err != io.EOF {
119
- res.SetError(err, cmds.ErrNormal)
120
- return
121
- }
122
- if file == nil { // done
123
- return
124
- }
123
+ rootnd, err := addParams.addFile(file)
124
+ if err != nil {
125
+ return err
126
+ }
127
126
- addParams := adder{
127
- node: n,
128
- out: outChan,
129
- progress: progress,
130
- hidden: hidden,
131
- trickle: trickle,
132
- }
128
+ rnk, err := rootnd.Key()
129
+ if err != nil {
130
+ return err
131
+ }
132
134
- if wrap {
135
- file = files.NewSliceFile("", []files.File{file})
136
- }
133
+ mp := n.Pinning.GetManual()
134
+ mp.RemovePinWithMode(rnk, pin.Indirect)
135
+ mp.PinWithMode(rnk, pin.Recursive)
136
+ return n.Pinning.Flush()
137
+ }
138
138
- rootnd, err := addParams.addFile(file)
139
- if err != nil {
140
- res.SetError(err, cmds.ErrNormal)
141
- return
139
+ // addFilesSeparately loops over a convenience slice file to
140
+ // add each file individually. e.g. 'ipfs add a b c'
141
+ addFilesSeparately := func(sliceFile files.File) error {
142
+ for {
143
+ file, err := sliceFile.NextFile()
144
+ if err != nil && err != io.EOF {
145
+ return err
146
+ }
147
+ if file == nil {
148
+ return nil // done
149
}
150
144
- rnk, err := rootnd.Key()
145
- if err != nil {
146
- res.SetError(err, cmds.ErrNormal)
147
- return
151
+ if err := addSingleFile(file); err != nil {
152
+ return err
153
}
154
+ }
155
+ }
156
150
- mp := n.Pinning.GetManual()
151
- mp.RemovePinWithMode(rnk, pin.Indirect)
152
- mp.PinWithMode(rnk, pin.Recursive)
157
+ go func() {
158
+ defer close(outChan)
159
154
- err = n.Pinning.Flush()
155
- if err != nil {
156
- res.SetError(err, cmds.ErrNormal)
157
- return
158
- }
160
+ // really, we're unrapping, if !wrap, because
161
+ // req.Files() is already a SliceFile() with all of them,
162
+ // so can just use that slice as the wrapper.
163
+ var err error
164
+ if wrap {
165
+ err = addSingleFile(req.Files())
166
+ } else {
167
+ err = addFilesSeparately(req.Files())
168
+ }
169
+ if err != nil {
170
+ res.SetError(err, cmds.ErrNormal)
171
+ return
172
}
173
}()
174
},