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
}