ipfs-cluster/importer/import.go
Wyatt Daviau c4d1b34810 Tests to front end of adding pipeline
api client test
api test
one sharness test
refactoring of testingData for access from other packages
always wrap files added by cluster
remove unused flag 'progress'
changes to support hidden flag

License: MIT
Signed-off-by: Wyatt Daviau <wdaviau@cs.stanford.edu>
2018-08-07 20:11:24 +02:00

83 lines
1.7 KiB
Go

package importer
import (
"context"
"io"
"github.com/ipfs/ipfs-cluster/api"
"github.com/ipfs/go-ipfs-cmdkit/files"
)
func shouldIgnore(err error) bool {
if err == errNotFound {
return true
}
return false
}
// ToChannel imports file to ipfs ipld nodes, outputting nodes on the
// provided channel
func ToChannel(ctx context.Context, f files.File, hidden bool,
trickle bool, raw bool, silent bool,
chunker string) (<-chan *api.AddedOutput, <-chan *api.NodeWithMeta, <-chan error) {
printChan := make(chan *api.AddedOutput)
errChan := make(chan error)
outChan := make(chan *api.NodeWithMeta)
dserv := &outDAGService{
membership: make(map[string]struct{}),
outChan: outChan,
}
fileAdder, err := NewAdder(ctx, nil, dserv)
if err != nil {
go func() {
errChan <- err
}()
return printChan, outChan, errChan
}
fileAdder.Hidden = hidden
fileAdder.Trickle = trickle
fileAdder.RawLeaves = raw
fileAdder.Silent = silent
// Files added in one session are wrapped. This is because if files
// are sharded together then the share one logical clusterDAG root hash
fileAdder.Wrap = true
fileAdder.Chunker = chunker
fileAdder.Out = printChan
go func() {
defer close(printChan)
defer close(outChan)
defer close(errChan)
// add all files under the root, as in ipfs
for {
file, err := f.NextFile()
if err == io.EOF {
break
} else if err != nil {
errChan <- err
return
}
select {
case <-ctx.Done():
return
default:
}
if err := fileAdder.AddFile(file); err != nil {
errChan <- err
return
}
}
_, err := fileAdder.Finalize()
if err != nil && !shouldIgnore(err) {
errChan <- err
}
}()
return printChan, outChan, errChan
}