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