diff --git a/core/commands/add.go b/core/commands/add.go index b7f3d6a8437..40e170cdb71 100644 --- a/core/commands/add.go +++ b/core/commands/add.go @@ -270,7 +270,7 @@ You can now check what blocks have been created by: fileAdder.Hidden = hidden fileAdder.Trickle = trickle fileAdder.Wrap = wrap - fileAdder.Pin = dopin + fileAdder.Pin = dopin && !hash fileAdder.Silent = silent fileAdder.RawLeaves = rawblks fileAdder.NoCopy = nocopy @@ -297,42 +297,12 @@ You can now check what blocks have been created by: fileAdder.SetMfsRoot(mr) } - addAllAndPin := func(f files.File) error { - // Iterate over each top-level file and add individually. Otherwise the - // single files.File f is treated as a directory, affecting hidden file - // semantics. - for { - file, err := f.NextFile() - if err == io.EOF { - // Finished the list of files. - break - } else if err != nil { - return err - } - if err := fileAdder.AddFile(file); err != nil { - return err - } - } - - // copy intermediary nodes from editor to our actual dagservice - _, err := fileAdder.Finalize() - if err != nil { - return err - } - - if hash { - return nil - } - - return fileAdder.PinRoot() - } - errCh := make(chan error) go func() { var err error defer func() { errCh <- err }() defer close(outChan) - err = addAllAndPin(req.Files) + err = fileAdder.AddAllAndPin(req.Files) }() err = res.Emit(outChan) diff --git a/core/coreunix/add.go b/core/coreunix/add.go index ad8450f6a2b..3792db9430a 100644 --- a/core/coreunix/add.go +++ b/core/coreunix/add.go @@ -398,8 +398,8 @@ func (adder *Adder) addNode(node ipld.Node, path string) error { return nil } -// AddFile adds the given file while respecting the adder. -func (adder *Adder) AddFile(file files.File) error { +// AddAllAndPin adds the given request's files and pin them. +func (adder *Adder) AddAllAndPin(file files.File) error { if adder.Pin { adder.unlocker = adder.blockstore.PinLock() } @@ -409,7 +409,41 @@ func (adder *Adder) AddFile(file files.File) error { } }() - return adder.addFile(file) + switch { + case file.IsDirectory(): + // Iterate over each top-level file and add individually. Otherwise the + // single files.File f is treated as a directory, affecting hidden file + // semantics. + for { + file, err := file.NextFile() + if err == io.EOF { + // Finished the list of files. + break + } else if err != nil { + return err + } + if err := adder.addFile(file); err != nil { + return err + } + } + break + default: + if err := adder.addFile(file); err != nil { + return err + } + break + } + + // copy intermediary nodes from editor to our actual dagservice + _, err := adder.Finalize() + if err != nil { + return err + } + + if !adder.Pin { + return nil + } + return adder.PinRoot() } func (adder *Adder) addFile(file files.File) error { diff --git a/core/coreunix/add_test.go b/core/coreunix/add_test.go index d2c9c7337d4..bba5d7ce8e7 100644 --- a/core/coreunix/add_test.go +++ b/core/coreunix/add_test.go @@ -85,7 +85,7 @@ func TestAddGCLive(t *testing.T) { go func() { defer close(addDone) defer close(out) - err := adder.AddFile(slf) + err := adder.AddAllAndPin(slf) if err != nil { t.Fatal(err) @@ -191,7 +191,7 @@ func testAddWPosInfo(t *testing.T, rawLeaves bool) { go func() { defer close(adder.Out) - err = adder.AddFile(file) + err = adder.AddAllAndPin(file) if err != nil { t.Fatal(err) }