Skip to content

Commit 7d254ae

Browse files
committedJun 20, 2015
Merge pull request #1404 from ipfs/feat/patch-path
allow patch add-link to add at a path
2 parents 09f1600 + d585e20 commit 7d254ae

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed
 

‎core/commands/object.go

+49-10
Original file line numberDiff line numberDiff line change
@@ -602,36 +602,75 @@ func addLinkCaller(req cmds.Request, root *dag.Node) (key.Key, error) {
602602
return "", err
603603
}
604604

605-
name := req.Arguments()[2]
605+
path := req.Arguments()[2]
606606
childk := key.B58KeyDecode(req.Arguments()[3])
607607

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)
609611
if err != nil {
610612
return "", err
611613
}
612-
613-
return newkey, nil
614+
return nnode.Key()
614615
}
615616

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) {
617618
ctx, cancel := context.WithTimeout(ctx, time.Second*30)
618619
childnd, err := ds.Get(ctx, childk)
619620
if err != nil {
620621
cancel()
621-
return "", err
622+
return nil, err
622623
}
623624
cancel()
624625

625626
err = root.AddNodeLinkClean(childname, childnd)
626627
if err != nil {
627-
return "", err
628+
return nil, err
628629
}
629630

630-
newkey, err := ds.Add(root)
631+
_, err = ds.Add(root)
631632
if err != nil {
632-
return "", err
633+
return nil, err
633634
}
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
635674
}
636675

637676
func nodeFromTemplate(template string) (*dag.Node, error) {

‎test/sharness/t0051-object.sh

+14
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ test_object_cmd() {
100100
OUTPUT=$(ipfs object patch $EMPTY_DIR add-link foo $EMPTY_DIR)
101101
'
102102

103+
test_expect_success "multilayer ipfs patch works" '
104+
echo "hello world" > hwfile &&
105+
FILE=$(ipfs add -q hwfile) &&
106+
EMPTY=$(ipfs object new unixfs-dir) &&
107+
ONE=$(ipfs object patch $EMPTY add-link b $EMPTY) &&
108+
TWO=$(ipfs object patch $EMPTY add-link a $ONE) &&
109+
ipfs object patch $TWO add-link a/b/c $FILE > multi_patch
110+
'
111+
112+
test_expect_success "output looks good" '
113+
ipfs cat $(cat multi_patch)/a/b/c > hwfile_out &&
114+
test_cmp hwfile hwfile_out
115+
'
116+
103117
test_expect_success "should have created dir within a dir" '
104118
ipfs ls $OUTPUT > patched_output
105119
'

0 commit comments

Comments
 (0)
Please sign in to comment.