@cryptotaxi247 / kubo / commits / 9d8a4afd7

add partial resolving to resolver code

License: MIT Signed-off-by: Jeromy <why@ipfs.io>

Jeromy committed Dec 10, 2016 at 11:25 UTC 9d8a4afd75a9029ea7b1cc32fdfb8b9e0310dbd3
2 files changed +45 -2
core/commands/dag/dag.go
+12 -2
@@ -137,13 +137,23 @@ var DagGetCmd = &cmds.Command{
137 return
138 }
139
140 - obj, err := n.Resolver.ResolvePath(req.Context(), p)
140 + obj, rem, err := n.Resolver.ResolveToLastNode(req.Context(), p)
141 if err != nil {
142 res.SetError(err, cmds.ErrNormal)
143 return
144 }
145
146 - res.SetOutput(obj)
146 + var out interface{} = obj
147 + if len(rem) > 0 {
148 + final, _, err := obj.Resolve(rem)
149 + if err != nil {
150 + res.SetError(err, cmds.ErrNormal)
151 + return
152 + }
153 + out = final
154 + }
155 +
156 + res.SetOutput(out)
157 },
158 }
159
path/resolver.go
+33
@@ -73,6 +73,39 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) {
73 return c, parts[1:], nil
74 }
75
76 +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (node.Node, []string, error) {
77 + c, p, err := SplitAbsPath(fpath)
78 + if err != nil {
79 + return nil, nil, err
80 + }
81 +
82 + nd, err := r.DAG.Get(ctx, c)
83 + if err != nil {
84 + return nil, nil, err
85 + }
86 +
87 + for len(p) > 0 {
88 + val, rest, err := nd.Resolve(p)
89 + if err != nil {
90 + return nil, nil, err
91 + }
92 +
93 + switch val := val.(type) {
94 + case *node.Link:
95 + next, err := val.GetNode(ctx, r.DAG)
96 + if err != nil {
97 + return nil, nil, err
98 + }
99 + nd = next
100 + p = rest
101 + default:
102 + return nd, p, nil
103 + }
104 + }
105 +
106 + return nd, nil, nil
107 +}
108 +
109 // ResolvePath fetches the node for given path. It returns the last item
110 // returned by ResolvePathComponents.
111 func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, error) {