mfs: inherit CID prefix from from parent directory
License: MIT Signed-off-by: Kevin Atkinson <k@kevina.org>
Kevin Atkinson committed
Aug 16, 2017 at 19:18 UTC
f2fbfdf2917af25f61085f55c731a66e46ea09e2
7 files changed
+40
-7
core/commands/files/files.go
+2
@@ -890,8 +890,10 @@ func getFileHandle(r *mfs.Root, path string, create bool) (*mfs.File, error) {
890
if !ok {
891
return nil, fmt.Errorf("%s was not a directory", dirname)
892
}
893
+ prefix := pdir.GetPrefix()
894
895
nd := dag.NodeWithData(ft.FilePBData(nil, 0))
896
+ nd.SetPrefix(prefix)
897
err = pdir.AddChild(fname, nd)
898
if err != nil {
899
return nil, err
mfs/dir.go
+6
@@ -58,6 +58,11 @@ func NewDirectory(ctx context.Context, name string, node node.Node, parent child
58
}, nil
59
}
60
61
+// GetPrefix gets the CID prefix of the root node
62
+func (d *Directory) GetPrefix() *cid.Prefix {
63
+ return d.dirbuilder.GetPrefix()
64
+}
65
+
66
// SetPrefix sets the CID prefix
67
func (d *Directory) SetPrefix(prefix *cid.Prefix) {
68
d.dirbuilder.SetPrefix(prefix)
@@ -299,6 +304,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) {
304
}
305
306
ndir := ft.EmptyDirNode()
307
+ ndir.SetPrefix(d.GetPrefix())
308
309
_, err = d.dserv.Add(ndir)
310
if err != nil {
mfs/file.go
+8
-3
@@ -27,14 +27,19 @@ type File struct {
27
RawLeaves bool
28
}
29
30
-// NewFile returns a NewFile object with the given parameters
30
+// NewFile returns a NewFile object with the given parameters. If the
31
+// Cid version is non-zero RawLeaves will be enabled.
32
func NewFile(name string, node node.Node, parent childCloser, dserv dag.DAGService) (*File, error) {
32
- return &File{
33
+ fi := &File{
34
dserv: dserv,
35
parent: parent,
36
name: name,
37
node: node,
37
- }, nil
38
+ }
39
+ if node.Cid().Prefix().Version > 0 {
40
+ fi.RawLeaves = true
41
+ }
42
+ return fi, nil
43
}
44
45
const (
mfs/ops.go
+6
-2
@@ -129,7 +129,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
129
if err != nil {
130
return err
131
}
132
- mkd.SetPrefix(r.Prefix)
132
+ if r.Prefix != nil {
133
+ mkd.SetPrefix(r.Prefix)
134
+ }
135
fsn = mkd
136
} else if err != nil {
137
return err
@@ -148,7 +150,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
150
return err
151
}
152
}
151
- final.SetPrefix(r.Prefix)
153
+ if r.Prefix != nil {
154
+ final.SetPrefix(r.Prefix)
155
+ }
156
157
if flush {
158
err := final.Flush()
test/sharness/t0260-sharding-flag.sh
+2
-2
@@ -75,8 +75,8 @@ test_add_large_dir_v1() {
75
'
76
}
77
78
-# this hash implies both the directory and the leaf entries are CIDv1
79
-SHARDEDV1="zdj7WX91spg4DsnNpvoBLjyjXUGgcTTWavygBbSifpmJdgPUA"
78
+# this hash implies the directory is CIDv1 and leaf entries are CIDv1 and raw
79
+SHARDEDV1="zdj7WY8aNcxF49q1ZpFXfchNmbswnUxiVDVjmrHb53xRM8W4C"
80
test_add_large_dir_v1 "$SHARDEDV1"
81
82
test_launch_ipfs_daemon
unixfs/hamt/hamt.go
+7
@@ -121,6 +121,7 @@ func NewHamtFromDag(dserv dag.DAGService, nd node.Node) (*HamtShard, error) {
121
ds.children = make([]child, len(pbnd.Links()))
122
ds.bitfield = new(big.Int).SetBytes(pbd.GetData())
123
ds.hashFunc = pbd.GetHashType()
124
+ ds.prefix = &ds.nd.Prefix
125
126
return ds, nil
127
}
@@ -130,6 +131,11 @@ func (ds *HamtShard) SetPrefix(prefix *cid.Prefix) {
131
ds.prefix = prefix
132
}
133
134
+// GetPrefix gets the CID Prefix, may be nil if unset
135
+func (ds *HamtShard) Prefix() *cid.Prefix {
136
+ return ds.prefix
137
+}
138
+
139
// Node serializes the HAMT structure into a merkledag node with unixfs formatting
140
func (ds *HamtShard) Node() (node.Node, error) {
141
out := new(dag.ProtoNode)
@@ -500,6 +506,7 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string,
506
if err != nil {
507
return err
508
}
509
+ ns.prefix = ds.prefix
510
chhv := &hashBits{
511
b: hash([]byte(child.key)),
512
consumed: hv.consumed,
unixfs/io/dirbuilder.go
+9
@@ -115,6 +115,7 @@ func (d *Directory) switchToSharding(ctx context.Context) error {
115
if err != nil {
116
return err
117
}
118
+ s.SetPrefix(&d.dirnode.Prefix)
119
120
d.shard = s
121
for _, lnk := range d.dirnode.Links() {
@@ -192,3 +193,11 @@ func (d *Directory) GetNode() (node.Node, error) {
193
194
return d.shard.Node()
195
}
196
+
197
+func (d *Directory) GetPrefix() *cid.Prefix {
198
+ if d.shard == nil {
199
+ return &d.dirnode.Prefix
200
+ }
201
+
202
+ return d.shard.Prefix()
203
+}