@@ -582,36 +582,75 @@ func addLinkCaller(req cmds.Request, root *dag.Node) (key.Key, error) {
582
582
return "" , err
583
583
}
584
584
585
- name := req .Arguments ()[2 ]
585
+ path := req .Arguments ()[2 ]
586
586
childk := key .B58KeyDecode (req .Arguments ()[3 ])
587
587
588
- newkey , err := addLink (req .Context ().Context , nd .DAG , root , name , childk )
588
+ parts := strings .Split (path , "/" )
589
+
590
+ nnode , err := insertNodeAtPath (req .Context ().Context , nd .DAG , root , parts , childk )
589
591
if err != nil {
590
592
return "" , err
591
593
}
592
-
593
- return newkey , nil
594
+ return nnode .Key ()
594
595
}
595
596
596
- func addLink (ctx context.Context , ds dag.DAGService , root * dag.Node , childname string , childk key.Key ) (key. Key , error ) {
597
+ func addLink (ctx context.Context , ds dag.DAGService , root * dag.Node , childname string , childk key.Key ) (* dag. Node , error ) {
597
598
ctx , cancel := context .WithTimeout (ctx , time .Second * 30 )
598
599
childnd , err := ds .Get (ctx , childk )
599
600
if err != nil {
600
601
cancel ()
601
- return "" , err
602
+ return nil , err
602
603
}
603
604
cancel ()
604
605
605
606
err = root .AddNodeLinkClean (childname , childnd )
606
607
if err != nil {
607
- return "" , err
608
+ return nil , err
608
609
}
609
610
610
- newkey , err : = ds .Add (root )
611
+ _ , err = ds .Add (root )
611
612
if err != nil {
612
- return "" , err
613
+ return nil , err
613
614
}
614
- return newkey , nil
615
+ return root , nil
616
+ }
617
+
618
+ func insertNodeAtPath (ctx context.Context , ds dag.DAGService , root * dag.Node , path []string , toinsert key.Key ) (* dag.Node , error ) {
619
+ if len (path ) == 1 {
620
+ return addLink (ctx , ds , root , path [0 ], toinsert )
621
+ }
622
+
623
+ child , err := root .GetNodeLink (path [0 ])
624
+ if err != nil {
625
+ return nil , err
626
+ }
627
+
628
+ nd , err := child .GetNode (ctx , ds )
629
+ if err != nil {
630
+ return nil , err
631
+ }
632
+
633
+ ndprime , err := insertNodeAtPath (ctx , ds , nd , path [1 :], toinsert )
634
+ if err != nil {
635
+ return nil , err
636
+ }
637
+
638
+ err = root .RemoveNodeLink (path [0 ])
639
+ if err != nil {
640
+ return nil , err
641
+ }
642
+
643
+ err = root .AddNodeLinkClean (path [0 ], ndprime )
644
+ if err != nil {
645
+ return nil , err
646
+ }
647
+
648
+ _ , err = ds .Add (root )
649
+ if err != nil {
650
+ return nil , err
651
+ }
652
+
653
+ return root , nil
615
654
}
616
655
617
656
func nodeFromTemplate (template string ) (* dag.Node , error ) {
0 commit comments