From f68e1843f4a50bafd88b73e018cc3d51a6be20b2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 18 Oct 2016 17:05:38 -0700 Subject: [PATCH] allow cid format selection in block put command License: MIT Signed-off-by: Jeromy --- core/commands/block.go | 48 +++++++++++++++++++++++++++++++----- test/sharness/t0050-block.sh | 15 +++++++++++ 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/core/commands/block.go b/core/commands/block.go index e8e7890f1de..6655764405f 100644 --- a/core/commands/block.go +++ b/core/commands/block.go @@ -2,7 +2,6 @@ package commands import ( "bytes" - "errors" "fmt" "io" "io/ioutil" @@ -11,7 +10,9 @@ import ( "github.com/ipfs/go-ipfs/blocks" util "github.com/ipfs/go-ipfs/blocks/blockstore/util" cmds "github.com/ipfs/go-ipfs/commands" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) @@ -114,6 +115,9 @@ It reads from stdin, and is a base58 encoded multihash. Arguments: []cmds.Argument{ cmds.FileArg("data", true, false, "The data to be stored as an IPFS block.").EnableStdin(), }, + Options: []cmds.Option{ + cmds.StringOption("format", "f", "cid format for blocks to be created with.").Default("v0"), + }, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() if err != nil { @@ -139,7 +143,39 @@ It reads from stdin, and is a base58 encoded multihash. return } - b := blocks.NewBlock(data) + format, _, _ := req.Option("format").String() + var pref cid.Prefix + pref.MhType = mh.SHA2_256 + pref.MhLength = -1 + pref.Version = 1 + switch format { + case "cbor": + pref.Codec = cid.CBOR + case "json": + pref.Codec = cid.JSON + case "protobuf": + pref.Codec = cid.Protobuf + case "raw": + pref.Codec = cid.Raw + case "v0": + pref.Version = 0 + pref.Codec = cid.Protobuf + default: + res.SetError(fmt.Errorf("unrecognized format: %s", format), cmds.ErrNormal) + return + } + + bcid, err := pref.Sum(data) + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + + b, err := blocks.NewBlockWithCid(data, bcid) + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } log.Debugf("BlockPut key: '%q'", b.Cid()) k, err := n.Blocks.AddBlock(b) @@ -163,15 +199,15 @@ It reads from stdin, and is a base58 encoded multihash. } func getBlockForKey(req cmds.Request, skey string) (blocks.Block, error) { + if len(skey) == 0 { + return nil, fmt.Errorf("zero length cid invalid") + } + n, err := req.InvocContext().GetNode() if err != nil { return nil, err } - if !u.IsValidHash(skey) { - return nil, errors.New("Not a valid hash") - } - c, err := cid.Decode(skey) if err != nil { return nil, err diff --git a/test/sharness/t0050-block.sh b/test/sharness/t0050-block.sh index d9c83406aec..af5a5e1e58f 100755 --- a/test/sharness/t0050-block.sh +++ b/test/sharness/t0050-block.sh @@ -169,6 +169,21 @@ test_expect_success "multi-block 'ipfs block rm -q' produces no output" ' test ! -s block_rm_out ' +test_expect_success "can set cid format on block put" ' + HASH=$(ipfs block put --format=protobuf ../t0051-object-data/testPut.pb) +' + +test_expect_success "created an object correctly!" ' + ipfs object get $HASH > obj_out && + echo "{\"Links\":[],\"Data\":\"test json for sharness test\"}" > obj_exp && + test_cmp obj_out obj_exp +' + +test_expect_success "block get output looks right" ' + ipfs block get $HASH > pb_block_out && + test_cmp pb_block_out ../t0051-object-data/testPut.pb +' + # # Misc tests #