From 9d8a4afd75a9029ea7b1cc32fdfb8b9e0310dbd3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 10 Dec 2016 11:25:29 -0800 Subject: [PATCH 1/2] add partial resolving to resolver code License: MIT Signed-off-by: Jeromy --- core/commands/dag/dag.go | 14 ++++++++++++-- path/resolver.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/core/commands/dag/dag.go b/core/commands/dag/dag.go index 81b58fd927b..c03771b45d8 100644 --- a/core/commands/dag/dag.go +++ b/core/commands/dag/dag.go @@ -137,13 +137,23 @@ var DagGetCmd = &cmds.Command{ return } - obj, err := n.Resolver.ResolvePath(req.Context(), p) + obj, rem, err := n.Resolver.ResolveToLastNode(req.Context(), p) if err != nil { res.SetError(err, cmds.ErrNormal) return } - res.SetOutput(obj) + var out interface{} = obj + if len(rem) > 0 { + final, _, err := obj.Resolve(rem) + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + out = final + } + + res.SetOutput(out) }, } diff --git a/path/resolver.go b/path/resolver.go index 1df66303a25..4339fbf0e6f 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -73,6 +73,39 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { return c, parts[1:], nil } +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (node.Node, []string, error) { + c, p, err := SplitAbsPath(fpath) + if err != nil { + return nil, nil, err + } + + nd, err := r.DAG.Get(ctx, c) + if err != nil { + return nil, nil, err + } + + for len(p) > 0 { + val, rest, err := nd.Resolve(p) + if err != nil { + return nil, nil, err + } + + switch val := val.(type) { + case *node.Link: + next, err := val.GetNode(ctx, r.DAG) + if err != nil { + return nil, nil, err + } + nd = next + p = rest + default: + return nd, p, nil + } + } + + return nd, nil, nil +} + // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, error) { From cb611c8873caf5ab5d3feb94b3776addbc74511a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 13 Feb 2017 19:15:17 -0800 Subject: [PATCH 2/2] allow for sub-object resolution in dag get License: MIT Signed-off-by: Jeromy --- core/commands/dag/dag.go | 2 +- merkledag/merkledag.go | 2 +- package.json | 4 ++-- test/sharness/t0053-dag.sh | 25 +++++++++++++++++++++++-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/core/commands/dag/dag.go b/core/commands/dag/dag.go index c03771b45d8..0c05cb07be0 100644 --- a/core/commands/dag/dag.go +++ b/core/commands/dag/dag.go @@ -10,8 +10,8 @@ import ( path "github.com/ipfs/go-ipfs/path" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - ipldcbor "gx/ipfs/QmWcQMNruWC3wphK1L6zEcV4MZBJqfsNKSRFcuo4AsNk4k/go-ipld-cbor" node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + ipldcbor "gx/ipfs/QmdaC21UyoyN3t9QdapHZfsaUo3mqVf5p4CEuFaYVFqwap/go-ipld-cbor" ) var DagCmd = &cmds.Command{ diff --git a/merkledag/merkledag.go b/merkledag/merkledag.go index 6257d8c5ff9..fb20948bc99 100644 --- a/merkledag/merkledag.go +++ b/merkledag/merkledag.go @@ -13,8 +13,8 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - ipldcbor "gx/ipfs/QmWcQMNruWC3wphK1L6zEcV4MZBJqfsNKSRFcuo4AsNk4k/go-ipld-cbor" node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + ipldcbor "gx/ipfs/QmdaC21UyoyN3t9QdapHZfsaUo3mqVf5p4CEuFaYVFqwap/go-ipld-cbor" ) var log = logging.Logger("merkledag") diff --git a/package.json b/package.json index 5bc55d63c28..38a53ccbe20 100644 --- a/package.json +++ b/package.json @@ -267,9 +267,9 @@ }, { "author": "whyrusleeping", - "hash": "QmWcQMNruWC3wphK1L6zEcV4MZBJqfsNKSRFcuo4AsNk4k", + "hash": "QmdaC21UyoyN3t9QdapHZfsaUo3mqVf5p4CEuFaYVFqwap", "name": "go-ipld-cbor", - "version": "1.2.0" + "version": "1.2.1" }, { "author": "lgierth", diff --git a/test/sharness/t0053-dag.sh b/test/sharness/t0053-dag.sh index d8ab1420e2e..fed63640c86 100755 --- a/test/sharness/t0053-dag.sh +++ b/test/sharness/t0053-dag.sh @@ -22,7 +22,7 @@ test_expect_success "make a few test files" ' ' test_expect_success "make an ipld object in json" ' - printf "{\"hello\":\"world\",\"cats\":[{\"/\":\"%s\"},{\"water\":{\"/\":\"%s\"}}],\"magic\":{\"/\":\"%s\"}}" $HASH1 $HASH2 $HASH3 > ipld_object + printf "{\"hello\":\"world\",\"cats\":[{\"/\":\"%s\"},{\"water\":{\"/\":\"%s\"}}],\"magic\":{\"/\":\"%s\"},\"sub\":{\"dict\":\"ionary\",\"beep\":[0,\"bop\"]}}" $HASH1 $HASH2 $HASH3 > ipld_object ' test_dag_cmd() { @@ -31,7 +31,7 @@ test_dag_cmd() { ' test_expect_success "output looks correct" ' - EXPHASH="zdpuAzn7KZcQmKJvpEM1DgHXaybVj7mRP4ZMrkW94taYEuZHp" + EXPHASH="zdpuAsXfkHapxohc8LtsCzYiAsy84ESqKRD8eWuY64tt9r2CE" test $EXPHASH = $IPLDHASH ' @@ -47,6 +47,27 @@ test_dag_cmd() { test_cmp file3 out3 ' + test_expect_success "resolving sub-objects works" ' + ipfs dag get $IPLDHASH/hello > sub1 && + ipfs dag get $IPLDHASH/sub > sub2 && + ipfs dag get $IPLDHASH/sub/beep > sub3 && + ipfs dag get $IPLDHASH/sub/beep/0 > sub4 && + ipfs dag get $IPLDHASH/sub/beep/1 > sub5 + ' + + test_expect_success "sub-objects look right" ' + echo "\"world\"" > sub1_exp && + test_cmp sub1_exp sub1 && + echo "{\"beep\":[0,\"bop\"],\"dict\":\"ionary\"}" > sub2_exp && + test_cmp sub2_exp sub2 && + echo "[0,\"bop\"]" > sub3_exp && + test_cmp sub3_exp sub3 && + echo "0" > sub4_exp && + test_cmp sub4_exp sub4 && + echo "\"bop\"" > sub5_exp && + test_cmp sub5_exp sub5 + ' + test_expect_success "can pin cbor object" ' ipfs pin add $EXPHASH '