teach ipfs refs -r how to use GetBlocks
Jeromy committed
Feb 18, 2015 at 18:38 UTC
3cda8ca685c16ae162df49368e170c6da721e011
1 file changed
+40
-12
core/commands/refs.go
+40
-12
@@ -227,6 +227,14 @@ type RefWriter struct {
227
228
// WriteRefs writes refs of the given object to the underlying writer.
229
func (rw *RefWriter) WriteRefs(n *dag.Node) (int, error) {
230
+ if rw.Recursive {
231
+ return rw.writeRefsRecursive(n)
232
+ } else {
233
+ return rw.writeRefsSingle(n)
234
+ }
235
+}
236
+
237
+func (rw *RefWriter) writeRefsRecursive(n *dag.Node) (int, error) {
238
nkey, err := n.Key()
239
if err != nil {
240
return 0, err
@@ -236,29 +244,23 @@ func (rw *RefWriter) WriteRefs(n *dag.Node) (int, error) {
244
return 0, nil
245
}
246
239
- count := 0
240
- for _, l := range n.Links {
241
- lk := u.Key(l.Hash)
242
-
247
+ var count int
248
+ for i, ng := range rw.DAG.GetDAG(rw.Ctx, n) {
249
+ lk := u.Key(n.Links[i].Hash)
250
if rw.skip(lk) {
251
continue
252
}
253
247
- if err := rw.WriteEdge(nkey, lk, l.Name); err != nil {
254
+ if err := rw.WriteEdge(nkey, lk, n.Links[i].Name); err != nil {
255
return count, err
256
}
250
- count++
257
252
- if !rw.Recursive {
253
- continue
254
- }
255
-
256
- child, err := l.GetNode(rw.DAG)
258
+ nd, err := ng.Get()
259
if err != nil {
260
return count, err
261
}
262
261
- c, err := rw.WriteRefs(child)
263
+ c, err := rw.writeRefsRecursive(nd)
264
count += c
265
if err != nil {
266
return count, err
@@ -267,6 +269,32 @@ func (rw *RefWriter) WriteRefs(n *dag.Node) (int, error) {
269
return count, nil
270
}
271
272
+func (rw *RefWriter) writeRefsSingle(n *dag.Node) (int, error) {
273
+ nkey, err := n.Key()
274
+ if err != nil {
275
+ return 0, err
276
+ }
277
+
278
+ if rw.skip(nkey) {
279
+ return 0, nil
280
+ }
281
+
282
+ count := 0
283
+ for _, l := range n.Links {
284
+ lk := u.Key(l.Hash)
285
+
286
+ if rw.skip(lk) {
287
+ continue
288
+ }
289
+
290
+ if err := rw.WriteEdge(nkey, lk, l.Name); err != nil {
291
+ return count, err
292
+ }
293
+ count++
294
+ }
295
+ return count, nil
296
+}
297
+
298
// skip returns whether to skip a key
299
func (rw *RefWriter) skip(k u.Key) bool {
300
if !rw.Unique {