@cryptotaxi247 / kubo / commits / 332d4aeab

coreapi unixfs: change Wrap logic to make more sense

License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>

Łukasz Magiera committed Feb 25, 2019 at 17:26 UTC 332d4aeab1241fe25de6f8ba4f7decead444dad7
2 files changed +99 -81
core/coreapi/unixfs.go
+1
@@ -95,6 +95,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options
95 fileAdder.NoCopy = settings.NoCopy
96 fileAdder.Name = settings.StdinName
97 fileAdder.CidBuilder = prefix
98 + fileAdder.TopHidden = settings.TopHidden
99
100 switch settings.Layout {
101 case options.BalancedLayout:
core/coreunix/add.go
+98 -81
@@ -68,6 +68,7 @@ type Adder struct {
68 Out chan<- interface{}
69 Progress bool
70 Hidden bool
71 + TopHidden bool
72 Pin bool
73 Trickle bool
74 RawLeaves bool
@@ -192,53 +193,6 @@ func (adder *Adder) PinRoot() error {
193 return adder.pinning.Flush()
194 }
195
195 -// Finalize flushes the mfs root directory and returns the mfs root node.
196 -func (adder *Adder) Finalize() (ipld.Node, error) {
197 - mr, err := adder.mfsRoot()
198 - if err != nil {
199 - return nil, err
200 - }
201 - var root mfs.FSNode
202 - rootdir := mr.GetDirectory()
203 - root = rootdir
204 -
205 - err = root.Flush()
206 - if err != nil {
207 - return nil, err
208 - }
209 -
210 - var name string
211 - if !adder.Wrap {
212 - children, err := rootdir.ListNames(adder.ctx)
213 - if err != nil {
214 - return nil, err
215 - }
216 -
217 - if len(children) == 0 {
218 - return nil, fmt.Errorf("expected at least one child dir, got none")
219 - }
220 -
221 - // Replace root with the first child
222 - name = children[0]
223 - root, err = rootdir.Child(name)
224 - if err != nil {
225 - return nil, err
226 - }
227 - }
228 -
229 - err = adder.outputDirs(name, root)
230 - if err != nil {
231 - return nil, err
232 - }
233 -
234 - err = mr.Close()
235 - if err != nil {
236 - return nil, err
237 - }
238 -
239 - return root.GetNode()
240 -}
241 -
196 func (adder *Adder) outputDirs(path string, fsn mfs.FSNode) error {
197 switch fsn := fsn.(type) {
198 case *mfs.File:
@@ -321,30 +275,88 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
275 }
276 }()
277
324 - switch tf := file.(type) {
325 - case files.Directory:
326 - // Iterate over each top-level file and add individually. Otherwise the
327 - // single files.File f is treated as a directory, affecting hidden file
328 - // semantics.
329 - it := tf.Entries()
330 - for it.Next() {
331 - if err := adder.addFileNode(it.Name(), it.Node()); err != nil {
332 - return nil, err
333 - }
278 + d, dir := file.(files.Directory)
279 + if !dir || !adder.TopHidden {
280 + d = files.NewSliceDirectory([]files.DirEntry{
281 + files.FileEntry("", file),
282 + })
283 + }
284 +
285 +
286 + // Iterate over each top-level file and add individually. Otherwise the
287 + // single files.File f is treated as a directory, affecting hidden file
288 + // semantics.
289 + it := d.Entries()
290 + for it.Next() {
291 + if err := adder.addFileNode(it.Name(), it.Node(), true); err != nil {
292 + return nil, err
293 + }
294 + }
295 + if it.Err() != nil {
296 + return nil, it.Err()
297 + }
298 +
299 + mr, err := adder.mfsRoot()
300 + if err != nil {
301 + return nil, err
302 + }
303 + var root mfs.FSNode
304 + rootdir := mr.GetDirectory()
305 + root = rootdir
306 +
307 + err = root.Flush()
308 + if err != nil {
309 + return nil, err
310 + }
311 +
312 + var name string
313 + if !adder.Wrap && !dir {
314 + children, err := rootdir.ListNames(adder.ctx)
315 + if err != nil {
316 + return nil, err
317 }
335 - if it.Err() != nil {
336 - return nil, it.Err()
318 +
319 + if len(children) == 0 {
320 + return nil, fmt.Errorf("expected at least one child dir, got none")
321 }
338 - break
339 - default:
340 - if err := adder.addFileNode("", file); err != nil {
322 +
323 + // Replace root with the first child
324 + name = children[0]
325 + root, err = rootdir.Child(name)
326 + if err != nil {
327 + return nil, err
328 + }
329 + }
330 +
331 + err = mr.Close()
332 + if err != nil {
333 + return nil, err
334 + }
335 +
336 + nd, err := root.GetNode()
337 + if err != nil {
338 + return nil, err
339 + }
340 +
341 + if adder.Wrap && dir {
342 + name = nd.Cid().String()
343 +
344 + end := unixfs.EmptyDirNode()
345 + if err := end.AddNodeLink(nd.Cid().String(), nd); err != nil {
346 + return nil, err
347 + }
348 + nd = end
349 +
350 + if err := adder.dagService.Add(adder.ctx, end); err != nil {
351 + return nil, err
352 + }
353 +
354 + if err := outputDagnode(adder.Out, "", nd); err != nil {
355 return nil, err
356 }
343 - break
357 }
358
346 - // copy intermediary nodes from editor to our actual dagservice
347 - nd, err := adder.Finalize()
359 + err = adder.outputDirs(name, root)
360 if err != nil {
361 return nil, err
362 }
@@ -355,8 +367,11 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
367 return nd, adder.PinRoot()
368 }
369
358 -func (adder *Adder) addFileNode(path string, file files.Node) error {
359 - defer file.Close()
370 +func (adder *Adder) addFileNode(path string, file files.Node, toplevel bool) error {
371 + if !toplevel {
372 + defer file.Close()
373 + }
374 +
375 err := adder.maybePauseForGC()
376 if err != nil {
377 return err
@@ -378,7 +393,7 @@ func (adder *Adder) addFileNode(path string, file files.Node) error {
393
394 switch f := file.(type) {
395 case files.Directory:
381 - return adder.addDir(path, f)
396 + return adder.addDir(path, f, toplevel)
397 case *files.Symlink:
398 return adder.addSymlink(path, f)
399 case files.File:
@@ -433,20 +448,22 @@ func (adder *Adder) addFile(path string, file files.File) error {
448 return adder.addNode(dagnode, path)
449 }
450
436 -func (adder *Adder) addDir(path string, dir files.Directory) error {
451 +func (adder *Adder) addDir(path string, dir files.Directory, toplevel bool) error {
452 log.Infof("adding directory: %s", path)
453
439 - mr, err := adder.mfsRoot()
440 - if err != nil {
441 - return err
442 - }
443 - err = mfs.Mkdir(mr, path, mfs.MkdirOpts{
444 - Mkparents: true,
445 - Flush: false,
446 - CidBuilder: adder.CidBuilder,
447 - })
448 - if err != nil {
449 - return err
454 + if !(toplevel && path == "") {
455 + mr, err := adder.mfsRoot()
456 + if err != nil {
457 + return err
458 + }
459 + err = mfs.Mkdir(mr, path, mfs.MkdirOpts{
460 + Mkparents: true,
461 + Flush: false,
462 + CidBuilder: adder.CidBuilder,
463 + })
464 + if err != nil {
465 + return err
466 + }
467 }
468
469 it := dir.Entries()
@@ -458,7 +475,7 @@ func (adder *Adder) addDir(path string, dir files.Directory) error {
475 log.Infof("%s is hidden, skipping", fpath)
476 continue
477 }
461 - err = adder.addFileNode(fpath, it.Node())
478 + err := adder.addFileNode(fpath, it.Node(), false)
479 if err != nil {
480 return err
481 }