@cryptotaxi247 / kubo / commits / 4a7c1cf80

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 },