Skip to content

Commit

Permalink
dag: Support multiple files in put
Browse files Browse the repository at this point in the history
License: MIT
Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
  • Loading branch information
magik6k committed Sep 20, 2017
1 parent 2b12a33 commit eb7da51
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 40 deletions.
107 changes: 69 additions & 38 deletions core/commands/dag/dag.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ import (
"strings"

cmds "github.com/ipfs/go-ipfs/commands"
files "github.com/ipfs/go-ipfs/commands/files"
coredag "github.com/ipfs/go-ipfs/core/coredag"
path "github.com/ipfs/go-ipfs/path"
pin "github.com/ipfs/go-ipfs/pin"

cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid"
u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util"
mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash"
"reflect"
)

var DagCmd = &cmds.Command{
Expand Down Expand Up @@ -53,7 +56,7 @@ into an object of the specified format.
`,
},
Arguments: []cmds.Argument{
cmds.FileArg("object data", true, false, "The object to put").EnableStdin(),
cmds.FileArg("object data", true, true, "The object to put").EnableStdin(),
},
Options: []cmds.Option{
cmds.StringOption("format", "f", "Format that the object will be added as.").Default("cbor"),
Expand All @@ -68,12 +71,6 @@ into an object of the specified format.
return
}

fi, err := req.Files().NextFile()
if err != nil {
res.SetError(err, cmds.ErrNormal)
return
}

ienc, _, _ := req.Option("input-enc").String()
format, _, _ := req.Option("format").String()
hash, _, err := req.Option("hash").String()
Expand All @@ -100,52 +97,86 @@ into an object of the specified format.
defer n.Blockstore.PinLock().Unlock()
}

nds, err := coredag.ParseInputs(ienc, format, fi, mhType, -1)
if err != nil {
res.SetError(err, cmds.ErrNormal)
return
}
if len(nds) == 0 {
res.SetError(fmt.Errorf("no node returned from ParseInputs"), cmds.ErrNormal)
return
}
outChan := make(chan interface{}, 8)
res.SetOutput((<-chan interface{})(outChan))

b := n.DAG.Batch()
for _, nd := range nds {
_, err := b.Add(nd)
if err != nil {
res.SetError(err, cmds.ErrNormal)
return
addAllAndPin := func(f files.File) error {
for {
file, err := f.NextFile()
if err == io.EOF {
// Finished the list of files.
break
} else if err != nil {
return err
}

nds, err := coredag.ParseInputs(ienc, format, file, mhType, -1)
if err != nil {
return err
}
if len(nds) == 0 {
return fmt.Errorf("no node returned from ParseInputs")
}

b := n.DAG.Batch()
for _, nd := range nds {
_, err := b.Add(nd)
if err != nil {
return err
}
}

if err := b.Commit(); err != nil {
return err
}

root := nds[0].Cid()
if dopin {
n.Pinning.PinWithMode(root, pin.Recursive)

err := n.Pinning.Flush()
if err != nil {
return err
}
}

outChan <- &OutputObject{Cid: root}
}
}

if err := b.Commit(); err != nil {
res.SetError(err, cmds.ErrNormal)
return
return nil
}

root := nds[0].Cid()
if dopin {
n.Pinning.PinWithMode(root, pin.Recursive)

err := n.Pinning.Flush()
if err != nil {
go func() {
defer close(outChan)
if err := addAllAndPin(req.Files()); err != nil {
res.SetError(err, cmds.ErrNormal)
return
}
}

res.SetOutput(&OutputObject{Cid: root})
}()
},
Type: OutputObject{},
Marshalers: cmds.MarshalerMap{
cmds.Text: func(res cmds.Response) (io.Reader, error) {
oobj, ok := res.Output().(*OutputObject)
outChan, ok := res.Output().(<-chan interface{})
if !ok {
return nil, fmt.Errorf("expected a different object in marshaler")
fmt.Println(reflect.TypeOf(res.Output()))
return nil, u.ErrCast()
}

marshal := func(v interface{}) (io.Reader, error) {
obj, ok := v.(*OutputObject)
if !ok {
return nil, u.ErrCast()
}

return strings.NewReader(obj.Cid.String() + "\n"), nil
}

return strings.NewReader(oobj.Cid.String()), nil
return &cmds.ChannelMarshaler{
Channel: outChan,
Marshaler: marshal,
Res: res,
}, nil
},
},
}
Expand Down
17 changes: 15 additions & 2 deletions test/sharness/t0053-dag.sh
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ test_dag_cmd() {
'

test_expect_success "dag put with dag-pb works output looks good" '
printf $HASH > dag_put_exp &&
echo $HASH > dag_put_exp &&
test_cmp dag_put_exp dag_put_out
'

Expand All @@ -163,7 +163,20 @@ test_dag_cmd() {
'

test_expect_success "dag put with dag-pb works output looks good" '
printf $HASH > dag_put_exp &&
echo $HASH > dag_put_exp &&
test_cmp dag_put_exp dag_put_out
'

test_expect_success "dag put multiple files" '
printf {\"foo\":\"bar\"} > a.json &&
printf {\"foo\":\"baz\"} > b.json &&
ipfs dag put a.json b.json > dag_put_out
'

test_expect_success "dag put multiple files output looks good" '
echo zdpuAoKMEvka7gKGSjF9B3of1F5gE5MyMMywxTC13wCmouQrf > dag_put_exp &&
echo zdpuAogmDEvpvGjMFsNTGDEU1JMYe6v69oxR8nG81EurmGHMj >> dag_put_exp &&
test_cmp dag_put_exp dag_put_out
'

Expand Down

0 comments on commit eb7da51

Please sign in to comment.