From 47001548e1d074ba2d03578ef9647ee0ad3d0fbb Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 20 Jun 2017 17:05:24 -0400 Subject: [PATCH] Finish basic support for raw nodes in dag modifier. License: MIT Signed-off-by: Kevin Atkinson --- test/sharness/t0250-files-api.sh | 37 ++++++++++++++++++++++++++++++++ unixfs/mod/dagmodifier.go | 34 +++++++++++++++-------------- unixfs/mod/dagmodifier_test.go | 3 ++- 3 files changed, 57 insertions(+), 17 deletions(-) diff --git a/test/sharness/t0250-files-api.sh b/test/sharness/t0250-files-api.sh index ffd5bc8ad..1c977a93c 100755 --- a/test/sharness/t0250-files-api.sh +++ b/test/sharness/t0250-files-api.sh @@ -15,6 +15,7 @@ test_expect_success "can create some files for testing" ' FILE1=$(echo foo | ipfs add -q) && FILE2=$(echo bar | ipfs add -q) && FILE3=$(echo baz | ipfs add -q) && + FILE9=$(echo zip | ipfs add -q --raw-leaves) && mkdir stuff_test && echo cats > stuff_test/a && echo dogs > stuff_test/b && @@ -252,6 +253,42 @@ test_files_api() { test_cmp roothash roothashafter ' + # test raw node + + test_expect_success "can put a raw-node into root" ' + ipfs files cp /ipfs/$FILE9 /file9 + ' + + test_expect_success "file shows up in root" ' + verify_dir_contents / file9 cats + ' + + test_expect_success "can read file" ' + ipfs files read /file9 > file9out + ' + + test_expect_success "output looks good" ' + echo zip > expected && + test_cmp expected file9out + ' + + test_expect_success "can remove file from root" ' + ipfs files rm /file9 + ' + + test_expect_success "file no longer appears" ' + verify_dir_contents / cats + ' + + test_expect_success "check root hash" ' + ipfs files stat --hash / > roothash + ' + + test_expect_success "check root hash was not changed" ' + ipfs files stat --hash / > roothashafter && + test_cmp roothash roothashafter + ' + # test read options test_expect_success "read from offset works" ' diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 9e86d7b60..83da608b9 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -152,23 +152,25 @@ func (dm *DagModifier) Write(b []byte) (int, error) { var ErrNoRawYet = fmt.Errorf("currently only fully support protonodes in the dagmodifier") func (dm *DagModifier) Size() (int64, error) { - pbnd, ok := dm.curNode.(*mdag.ProtoNode) - if !ok { - return 0, ErrNoRawYet - } - - pbn, err := ft.FromBytes(pbnd.Data()) - if err != nil { - return 0, err - } - - if dm.wrBuf != nil { - if uint64(dm.wrBuf.Len())+dm.writeStart > pbn.GetFilesize() { + switch nd := dm.curNode.(type) { + case *mdag.ProtoNode: + pbn, err := ft.FromBytes(nd.Data()) + if err != nil { + return 0, err + } + if dm.wrBuf != nil && uint64(dm.wrBuf.Len())+dm.writeStart > pbn.GetFilesize() { return int64(dm.wrBuf.Len()) + int64(dm.writeStart), nil } + return int64(pbn.GetFilesize()), nil + case *mdag.RawNode: + if dm.wrBuf != nil { + return 0, ErrNoRawYet + } + sz, err := nd.Size() + return int64(sz), err + default: + return 0, ErrNotUnixfs } - - return int64(pbn.GetFilesize()), nil } // Sync writes changes to this dag to disk @@ -397,12 +399,12 @@ func (dm *DagModifier) CtxReadFull(ctx context.Context, b []byte) (int, error) { } // GetNode gets the modified DAG Node -func (dm *DagModifier) GetNode() (*mdag.ProtoNode, error) { +func (dm *DagModifier) GetNode() (node.Node, error) { err := dm.Sync() if err != nil { return nil, err } - return dm.curNode.Copy().(*mdag.ProtoNode), nil + return dm.curNode.Copy(), nil } // HasChanges returned whether or not there are unflushed changes to this dag diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index d7b3f3267..b22844194 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -9,6 +9,7 @@ import ( h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" + mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" @@ -105,7 +106,7 @@ func TestDagModifierBasic(t *testing.T) { t.Fatal(err) } - size, err := ft.DataSize(node.Data()) + size, err := ft.DataSize(node.(*mdag.ProtoNode).Data()) if err != nil { t.Fatal(err) }