From 9d8a4afd75a9029ea7b1cc32fdfb8b9e0310dbd3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 10 Dec 2016 11:25:29 -0800 Subject: [PATCH] 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 81b58fd92..c03771b45 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 1df66303a..4339fbf0e 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) {