diff --git a/core/coreapi/unixfs_test.go b/core/coreapi/unixfs_test.go index aa5903a7f15..bbc522c2555 100644 --- a/core/coreapi/unixfs_test.go +++ b/core/coreapi/unixfs_test.go @@ -35,7 +35,7 @@ var helloStr = "hello, world!" var emptyDir = coreapi.ResolvedPath("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn", nil, nil) // `echo -n | ipfs add` -var emptyFile = coreapi.ResolvedPath("/ipfs/QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH", nil, nil) +var emptyFile = coreapi.ResolvedPath("/ipfs/Qmdsf68UUYTSSx3i4GtDJfxzpAEZt7Mp23m3qa36LYMSiW", nil, nil) func makeAPIIdent(ctx context.Context, fullIdentity bool) (*core.IpfsNode, coreiface.CoreAPI, error) { var ident config.Identity diff --git a/importer/balanced/builder.go b/importer/balanced/builder.go index c15c56c62de..4ea84df8fbe 100644 --- a/importer/balanced/builder.go +++ b/importer/balanced/builder.go @@ -51,7 +51,12 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { } if root == nil { - root = db.NewUnixfsNode() + // this should only happen with an empty node, so return a leaf + var err error + root, err = db.NewLeaf(nil) + if err != nil { + return nil, err + } } out, err := db.Add(root) diff --git a/importer/helpers/dagbuilder.go b/importer/helpers/dagbuilder.go index cf408ce4257..08b3a7ac058 100644 --- a/importer/helpers/dagbuilder.go +++ b/importer/helpers/dagbuilder.go @@ -122,6 +122,34 @@ func (db *DagBuilderHelper) NewUnixfsNode() *UnixfsNode { return n } +// NewLeaf creates a leaf node filled with data +func (db *DagBuilderHelper) NewLeaf(data []byte) (*UnixfsNode, error) { + if len(data) > BlockSizeLimit { + return nil, ErrSizeLimitExceeded + } + + if db.rawLeaves { + if db.prefix == nil { + return &UnixfsNode{ + rawnode: dag.NewRawNode(data), + raw: true, + }, nil + } + rawnode, err := dag.NewRawNodeWPrefix(data, *db.prefix) + if err != nil { + return nil, err + } + return &UnixfsNode{ + rawnode: rawnode, + raw: true, + }, nil + } + + blk := db.newUnixfsBlock() + blk.SetData(data) + return blk, nil +} + // newUnixfsBlock creates a new Unixfs node to represent a raw data block func (db *DagBuilderHelper) newUnixfsBlock() *UnixfsNode { n := &UnixfsNode{ @@ -164,30 +192,7 @@ func (db *DagBuilderHelper) GetNextDataNode() (*UnixfsNode, error) { return nil, nil } - if len(data) > BlockSizeLimit { - return nil, ErrSizeLimitExceeded - } - - if db.rawLeaves { - if db.prefix == nil { - return &UnixfsNode{ - rawnode: dag.NewRawNode(data), - raw: true, - }, nil - } - rawnode, err := dag.NewRawNodeWPrefix(data, *db.prefix) - if err != nil { - return nil, err - } - return &UnixfsNode{ - rawnode: rawnode, - raw: true, - }, nil - } - - blk := db.newUnixfsBlock() - blk.SetData(data) - return blk, nil + return db.NewLeaf(data) } // SetPosInfo sets the offset information of a node using the fullpath and stat diff --git a/test/sharness/t0040-add-and-cat.sh b/test/sharness/t0040-add-and-cat.sh index 80c20eff4b2..760f30c08d3 100755 --- a/test/sharness/t0040-add-and-cat.sh +++ b/test/sharness/t0040-add-and-cat.sh @@ -166,6 +166,24 @@ test_add_cat_file() { echo "added $HASH .hello.txt" >expected && test_cmp expected actual ' + + test_expect_success "add zero length file" ' + touch zero-length-file && + ZEROHASH=$(ipfs add -q zero-length-file) && + echo $ZEROHASH + ' + + test_expect_success "zero length file has correct hash" ' + test "$ZEROHASH" = Qmdsf68UUYTSSx3i4GtDJfxzpAEZt7Mp23m3qa36LYMSiW + ' + + test_expect_success "cat zero length file" ' + ipfs cat $ZEROHASH > zero-length-file_out + ' + + test_expect_success "make sure it looks good" ' + test_cmp zero-length-file zero-length-file_out + ' } test_add_cat_5MB() { @@ -221,6 +239,24 @@ test_add_cat_raw() { test_expect_success "make sure it looks good" ' test_cmp afile afile_out ' + + test_expect_success "add zero length file with raw-leaves" ' + touch zero-length-file && + ZEROHASH=$(ipfs add -q --raw-leaves zero-length-file) && + echo $ZEROHASH + ' + + test_expect_success "zero length file has correct hash" ' + test "$ZEROHASH" = zb2rhmy65F3REf8SZp7De11gxtECBGgUKaLdiDj7MCGCHxbDW + ' + + test_expect_success "cat zero length file" ' + ipfs cat $ZEROHASH > zero-length-file_out + ' + + test_expect_success "make sure it looks good" ' + test_cmp zero-length-file zero-length-file_out + ' } test_add_cat_expensive() { diff --git a/test/sharness/t0111-gateway-writeable.sh b/test/sharness/t0111-gateway-writeable.sh index 655f60a178a..6e5169bfb7d 100755 --- a/test/sharness/t0111-gateway-writeable.sh +++ b/test/sharness/t0111-gateway-writeable.sh @@ -14,7 +14,7 @@ test_launch_ipfs_daemon --writable test_expect_success "ipfs daemon --writable overrides config" ' curl -v -X POST http://$GWAY_ADDR/ipfs/ 2> outfile && grep "HTTP/1.1 201 Created" outfile && - grep "Location: /ipfs/QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH" outfile + grep "Location: /ipfs/Qmdsf68UUYTSSx3i4GtDJfxzpAEZt7Mp23m3qa36LYMSiW" outfile ' test_kill_ipfs_daemon