From e1bc025e38f31cd43da1ff60eb634a5aac3397be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 27 Jul 2017 12:47:18 +0200 Subject: [PATCH 1/3] object put --pin option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- core/commands/object/object.go | 27 +++++++++++++++++++++++++++ test/sharness/t0051-object.sh | 18 +++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/core/commands/object/object.go b/core/commands/object/object.go index 55d9f0282..8c61f91bd 100644 --- a/core/commands/object/object.go +++ b/core/commands/object/object.go @@ -16,6 +16,7 @@ import ( core "github.com/ipfs/go-ipfs/core" dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" + pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" @@ -355,6 +356,7 @@ And then run: Options: []cmds.Option{ cmds.StringOption("inputenc", "Encoding type of input data. One of: {\"protobuf\", \"json\"}.").Default("json"), cmds.StringOption("datafieldenc", "Encoding type of the data field, either \"text\" or \"base64\".").Default("text"), + cmds.BoolOption("pin", "Pin this object when adding.").Default(false), }, Run: func(req cmds.Request, res cmds.Response) { n, err := req.InvocContext().GetNode() @@ -381,6 +383,16 @@ And then run: return } + dopin, _, err := req.Option("pin").Bool() + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + + if dopin { + defer n.Blockstore.PinLock().Unlock() + } + output, err := objectPut(n, input, inputenc, datafieldenc) if err != nil { errType := cmds.ErrNormal @@ -391,6 +403,21 @@ And then run: return } + if dopin { + c, err := cid.Decode(output.Hash) + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + + n.Pinning.PinWithMode(c, pin.Recursive) + err = n.Pinning.Flush() + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + } + res.SetOutput(output) }, Marshalers: cmds.MarshalerMap{ diff --git a/test/sharness/t0051-object.sh b/test/sharness/t0051-object.sh index fab8c1231..183a041fb 100755 --- a/test/sharness/t0051-object.sh +++ b/test/sharness/t0051-object.sh @@ -168,7 +168,23 @@ test_object_cmd() { test_cmp expected actual ' - test_expect_success "'ipfs object patch' should work (no unixfs-dir)" ' + test_expect_success "'ipfs object put --pin' succeeds" ' + HASH="QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V" && + echo "added $HASH" >expected && + echo "{ \"Data\": \"abc\" }" | ipfs object put --pin >actual + ' + + test_expect_success "'ipfs object put --pin' output looks good" ' + echo "added $HASH" >expected && + test_cmp expected actual + ' + + test_expect_success "after gc, objects still acessible" ' + ipfs repo gc > /dev/null && + ipfs refs -r --timeout=2s $HASH > /dev/null + ' + + test_expect_success "'ipfs object patch' should work (no unixfs-dir)" ' EMPTY_DIR=$(ipfs object new) && OUTPUT=$(ipfs object patch $EMPTY_DIR add-link foo $EMPTY_DIR) && ipfs object stat $OUTPUT From c9446a77203a510ab44e24b05510c6c89d3bc026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 31 Jul 2017 19:36:32 +0200 Subject: [PATCH 2/3] object: make objectPut return CID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- core/commands/object/object.go | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/core/commands/object/object.go b/core/commands/object/object.go index 8c61f91bd..45621189b 100644 --- a/core/commands/object/object.go +++ b/core/commands/object/object.go @@ -393,7 +393,7 @@ And then run: defer n.Blockstore.PinLock().Unlock() } - output, err := objectPut(n, input, inputenc, datafieldenc) + objectCid, err := objectPut(n, input, inputenc, datafieldenc) if err != nil { errType := cmds.ErrNormal if err == ErrUnknownObjectEnc { @@ -404,13 +404,7 @@ And then run: } if dopin { - c, err := cid.Decode(output.Hash) - if err != nil { - res.SetError(err, cmds.ErrNormal) - return - } - - n.Pinning.PinWithMode(c, pin.Recursive) + n.Pinning.PinWithMode(objectCid, pin.Recursive) err = n.Pinning.Flush() if err != nil { res.SetError(err, cmds.ErrNormal) @@ -418,15 +412,15 @@ And then run: } } - res.SetOutput(output) + res.SetOutput(objectCid) }, Marshalers: cmds.MarshalerMap{ cmds.Text: func(res cmds.Response) (io.Reader, error) { - object := res.Output().(*Object) - return strings.NewReader("added " + object.Hash + "\n"), nil + object := res.Output().(*cid.Cid) + return strings.NewReader("added " + object.String() + "\n"), nil }, }, - Type: Object{}, + Type: cid.Cid{}, } var ObjectNewCmd = &cmds.Command{ @@ -495,7 +489,7 @@ func nodeFromTemplate(template string) (*dag.ProtoNode, error) { var ErrEmptyNode = errors.New("no data or links in this node") // objectPut takes a format option, serializes bytes from stdin and updates the dag with that data -func objectPut(n *core.IpfsNode, input io.Reader, encoding string, dataFieldEncoding string) (*Object, error) { +func objectPut(n *core.IpfsNode, input io.Reader, encoding string, dataFieldEncoding string) (*cid.Cid, error) { data, err := ioutil.ReadAll(io.LimitReader(input, inputLimit+10)) if err != nil { @@ -560,7 +554,7 @@ func objectPut(n *core.IpfsNode, input io.Reader, encoding string, dataFieldEnco return nil, err } - return getOutput(dagnode) + return dagnode.Cid(), nil } // ErrUnknownObjectEnc is returned if a invalid encoding is supplied From 778d6c635de34bcd27e1b590136152fb1da75b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 31 Jul 2017 21:30:35 +0200 Subject: [PATCH 3/3] object put: wrap CID in Object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera --- core/commands/object/object.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/commands/object/object.go b/core/commands/object/object.go index 45621189b..e7c778848 100644 --- a/core/commands/object/object.go +++ b/core/commands/object/object.go @@ -412,15 +412,15 @@ And then run: } } - res.SetOutput(objectCid) + res.SetOutput(&Object{Hash: objectCid.String()}) }, Marshalers: cmds.MarshalerMap{ cmds.Text: func(res cmds.Response) (io.Reader, error) { - object := res.Output().(*cid.Cid) - return strings.NewReader("added " + object.String() + "\n"), nil + object := res.Output().(*Object) + return strings.NewReader("added " + object.Hash + "\n"), nil }, }, - Type: cid.Cid{}, + Type: Object{}, } var ObjectNewCmd = &cmds.Command{