@@ -24,9 +24,10 @@ var PinCmd = &cmds.Command{
24
24
},
25
25
26
26
Subcommands : map [string ]* cmds.Command {
27
- "add" : addPinCmd ,
28
- "rm" : rmPinCmd ,
29
- "ls" : listPinCmd ,
27
+ "add" : addPinCmd ,
28
+ "rm" : rmPinCmd ,
29
+ "ls" : listPinCmd ,
30
+ "update" : updatePinCmd ,
30
31
},
31
32
}
32
33
@@ -332,6 +333,83 @@ Example:
332
333
},
333
334
}
334
335
336
+ var updatePinCmd = & cmds.Command {
337
+ Helptext : cmds.HelpText {
338
+ Tagline : "Update a recursive pin" ,
339
+ ShortDescription : `
340
+ Updates one pin to another, making sure that all objects in the new pin are
341
+ local. Then removes the old pin. This is an optimized version of adding the
342
+ new pin and removing the old one.
343
+ ` ,
344
+ },
345
+
346
+ Arguments : []cmds.Argument {
347
+ cmds .StringArg ("from-path" , true , false , "Path to old object." ),
348
+ cmds .StringArg ("to-path" , true , false , "Path to new object to be pinned." ),
349
+ },
350
+ Options : []cmds.Option {
351
+ cmds .BoolOption ("unpin" , "Remove the old pin." ).Default (true ),
352
+ },
353
+ Type : PinOutput {},
354
+ Run : func (req cmds.Request , res cmds.Response ) {
355
+ n , err := req .InvocContext ().GetNode ()
356
+ if err != nil {
357
+ res .SetError (err , cmds .ErrNormal )
358
+ return
359
+ }
360
+
361
+ unpin , _ , err := req .Option ("unpin" ).Bool ()
362
+ if err != nil {
363
+ res .SetError (err , cmds .ErrNormal )
364
+ return
365
+ }
366
+
367
+ from , err := path .ParsePath (req .Arguments ()[0 ])
368
+ if err != nil {
369
+ res .SetError (err , cmds .ErrNormal )
370
+ return
371
+ }
372
+
373
+ to , err := path .ParsePath (req .Arguments ()[1 ])
374
+ if err != nil {
375
+ res .SetError (err , cmds .ErrNormal )
376
+ return
377
+ }
378
+
379
+ fromc , err := core .ResolveToCid (req .Context (), n , from )
380
+ if err != nil {
381
+ res .SetError (err , cmds .ErrNormal )
382
+ return
383
+ }
384
+
385
+ toc , err := core .ResolveToCid (req .Context (), n , to )
386
+ if err != nil {
387
+ res .SetError (err , cmds .ErrNormal )
388
+ return
389
+ }
390
+
391
+ err = n .Pinning .Update (req .Context (), fromc , toc , unpin )
392
+ if err != nil {
393
+ res .SetError (err , cmds .ErrNormal )
394
+ return
395
+ }
396
+
397
+ res .SetOutput (& PinOutput {Pins : []string {from .String (), to .String ()}})
398
+ },
399
+ Marshalers : cmds.MarshalerMap {
400
+ cmds .Text : func (res cmds.Response ) (io.Reader , error ) {
401
+ added , ok := res .Output ().(* PinOutput )
402
+ if ! ok {
403
+ return nil , u .ErrCast ()
404
+ }
405
+
406
+ buf := new (bytes.Buffer )
407
+ fmt .Fprintf (buf , "updated %s to %s\n " , added .Pins [0 ], added .Pins [1 ])
408
+ return buf , nil
409
+ },
410
+ },
411
+ }
412
+
335
413
type RefKeyObject struct {
336
414
Type string
337
415
}
0 commit comments