Merge pull request #4095 from ipfs/feat/object-pin

object put --pin option
This commit is contained in:
Jeromy Johnson 2017-08-12 14:32:18 -07:00 committed by GitHub
commit 50bb128bce
2 changed files with 42 additions and 5 deletions

View File

@ -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,7 +383,17 @@ And then run:
return
}
output, err := objectPut(n, input, inputenc, datafieldenc)
dopin, _, err := req.Option("pin").Bool()
if err != nil {
res.SetError(err, cmds.ErrNormal)
return
}
if dopin {
defer n.Blockstore.PinLock().Unlock()
}
objectCid, err := objectPut(n, input, inputenc, datafieldenc)
if err != nil {
errType := cmds.ErrNormal
if err == ErrUnknownObjectEnc {
@ -391,7 +403,16 @@ And then run:
return
}
res.SetOutput(output)
if dopin {
n.Pinning.PinWithMode(objectCid, pin.Recursive)
err = n.Pinning.Flush()
if err != nil {
res.SetError(err, cmds.ErrNormal)
return
}
}
res.SetOutput(&Object{Hash: objectCid.String()})
},
Marshalers: cmds.MarshalerMap{
cmds.Text: func(res cmds.Response) (io.Reader, error) {
@ -468,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 {
@ -533,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

View File

@ -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