@@ -602,36 +602,75 @@ func addLinkCaller(req cmds.Request, root *dag.Node) (key.Key, error) {
602
602
return "" , err
603
603
}
604
604
605
- name := req .Arguments ()[2 ]
605
+ path := req .Arguments ()[2 ]
606
606
childk := key .B58KeyDecode (req .Arguments ()[3 ])
607
607
608
- newkey , err := addLink (req .Context ().Context , nd .DAG , root , name , childk )
608
+ parts := strings .Split (path , "/" )
609
+
610
+ nnode , err := insertNodeAtPath (req .Context ().Context , nd .DAG , root , parts , childk )
609
611
if err != nil {
610
612
return "" , err
611
613
}
612
-
613
- return newkey , nil
614
+ return nnode .Key ()
614
615
}
615
616
616
- func addLink (ctx context.Context , ds dag.DAGService , root * dag.Node , childname string , childk key.Key ) (key. Key , error ) {
617
+ func addLink (ctx context.Context , ds dag.DAGService , root * dag.Node , childname string , childk key.Key ) (* dag. Node , error ) {
617
618
ctx , cancel := context .WithTimeout (ctx , time .Second * 30 )
618
619
childnd , err := ds .Get (ctx , childk )
619
620
if err != nil {
620
621
cancel ()
621
- return "" , err
622
+ return nil , err
622
623
}
623
624
cancel ()
624
625
625
626
err = root .AddNodeLinkClean (childname , childnd )
626
627
if err != nil {
627
- return "" , err
628
+ return nil , err
628
629
}
629
630
630
- newkey , err : = ds .Add (root )
631
+ _ , err = ds .Add (root )
631
632
if err != nil {
632
- return "" , err
633
+ return nil , err
633
634
}
634
- return newkey , nil
635
+ return root , nil
636
+ }
637
+
638
+ func insertNodeAtPath (ctx context.Context , ds dag.DAGService , root * dag.Node , path []string , toinsert key.Key ) (* dag.Node , error ) {
639
+ if len (path ) == 1 {
640
+ return addLink (ctx , ds , root , path [0 ], toinsert )
641
+ }
642
+
643
+ child , err := root .GetNodeLink (path [0 ])
644
+ if err != nil {
645
+ return nil , err
646
+ }
647
+
648
+ nd , err := child .GetNode (ctx , ds )
649
+ if err != nil {
650
+ return nil , err
651
+ }
652
+
653
+ ndprime , err := insertNodeAtPath (ctx , ds , nd , path [1 :], toinsert )
654
+ if err != nil {
655
+ return nil , err
656
+ }
657
+
658
+ err = root .RemoveNodeLink (path [0 ])
659
+ if err != nil {
660
+ return nil , err
661
+ }
662
+
663
+ err = root .AddNodeLinkClean (path [0 ], ndprime )
664
+ if err != nil {
665
+ return nil , err
666
+ }
667
+
668
+ _ , err = ds .Add (root )
669
+ if err != nil {
670
+ return nil , err
671
+ }
672
+
673
+ return root , nil
635
674
}
636
675
637
676
func nodeFromTemplate (template string ) (* dag.Node , error ) {
0 commit comments