Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit dd9e76b

Browse files
committedAug 14, 2018
Add support for inlining via the id-hash to the add command.
License: MIT Signed-off-by: Kevin Atkinson <k@kevina.org>
1 parent 56ba44e commit dd9e76b

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed
 

‎core/commands/add.go

+10
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const (
4444
fstoreCacheOptionName = "fscache"
4545
cidVersionOptionName = "cid-version"
4646
hashOptionName = "hash"
47+
inlineOptionName = "inline"
48+
idHashLimitOptionName = "id-hash-limit"
4749
)
4850

4951
const adderOutChanSize = 8
@@ -120,6 +122,8 @@ You can now check what blocks have been created by:
120122
cmdkit.BoolOption(fstoreCacheOptionName, "Check the filestore for pre-existing blocks. (experimental)"),
121123
cmdkit.IntOption(cidVersionOptionName, "CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. (experimental)"),
122124
cmdkit.StringOption(hashOptionName, "Hash function to use. Implies CIDv1 if not sha2-256. (experimental)").WithDefault("sha2-256"),
125+
cmdkit.BoolOption(inlineOptionName, "Inline small objects using identity hash. (experimental)"),
126+
cmdkit.IntOption(idHashLimitOptionName, "Identity hash maxium size. (experimental)").WithDefault(64),
123127
},
124128
PreRun: func(req *cmds.Request, env cmds.Environment) error {
125129
quiet, _ := req.Options[quietOptionName].(bool)
@@ -173,6 +177,8 @@ You can now check what blocks have been created by:
173177
fscache, _ := req.Options[fstoreCacheOptionName].(bool)
174178
cidVer, cidVerSet := req.Options[cidVersionOptionName].(int)
175179
hashFunStr, _ := req.Options[hashOptionName].(string)
180+
inline, _ := req.Options[inlineOptionName].(bool)
181+
idHashLimit, _ := req.Options[idHashLimitOptionName].(int)
176182

177183
// The arguments are subject to the following constraints.
178184
//
@@ -281,6 +287,10 @@ You can now check what blocks have been created by:
281287
fileAdder.NoCopy = nocopy
282288
fileAdder.CidBuilder = &prefix
283289

290+
if inline {
291+
fileAdder.Prefix = Inliner{fileAdder.Prefix, idHashLimit}
292+
}
293+
284294
if hash {
285295
md := dagtest.Mock()
286296
emptyDirNode := ft.EmptyDirNode()

‎core/commands/inliner.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package commands
2+
3+
import (
4+
mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash"
5+
cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid"
6+
)
7+
8+
type Inliner struct {
9+
base cid.Builder
10+
limit int
11+
}
12+
13+
func (p Inliner) GetCodec() uint64 {
14+
return p.base.GetCodec()
15+
}
16+
17+
func (p Inliner) WithCodec(c uint64) cid.Builder {
18+
return Inliner{p.base.WithCodec(c), p.limit}
19+
}
20+
21+
func (p Inliner) Sum(data []byte) (*cid.Cid, error) {
22+
if len(data) > p.limit {
23+
return p.base.Sum(data)
24+
}
25+
return cid.V1Builder{Codec: p.base.GetCodec(), MhType: mh.ID}.Sum(data)
26+
}

‎test/sharness/t0040-add-and-cat.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ test_add_cat_expensive "--cid-version=1" "zdj7WcatQrtuE4WMkS4XsfsMixuQN2po4irkYh
590590
# encoded with the blake2b-256 hash funtion
591591
test_add_cat_expensive '--hash=blake2b-256' "zDMZof1kwndounDzQCANUHjiE3zt1mPEgx7RE3JTHoZrRRa79xcv"
592592

593-
test_add_named_pipe " Post http://$API_ADDR/api/v0/add?chunker=size-262144&encoding=json&hash=sha2-256&pin=true&progress=true&recursive=true&stream-channels=true:"
593+
test_add_named_pipe " Post http://$API_ADDR/api/v0/add?chunker=size-262144&encoding=json&hash=sha2-256&id-hash-limit=64&pin=true&progress=true&recursive=true&stream-channels=true:"
594594

595595
test_add_pwd_is_symlink
596596

‎test/sharness/t0046-id-hash.sh

+34
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,40 @@ test_expect_success "can still fetch it" '
4343
test_cmp junk.txt actual
4444
'
4545

46+
test_expect_success "ipfs add --inline works as expected" '
47+
echo $ID_HASH0_CONTENTS > afile &&
48+
HASH=$(ipfs add -q --inline afile)
49+
'
50+
51+
test_expect_success "ipfs add --inline outputs the correct hash" '
52+
echo zrjkGSFoQBjsuadykdx7acCCDAmcLX4HmLUFCs = "$HASH" &&
53+
test zrjkGSFoQBjsuadykdx7acCCDAmcLX4HmLUFCs = "$HASH"
54+
'
55+
56+
test_expect_success "ipfs add --inline --raw-leaves works as expected" '
57+
echo $ID_HASH0_CONTENTS > afile &&
58+
HASH=$(ipfs add -q --inline --raw-leaves afile)
59+
'
60+
61+
test_expect_success "ipfs add --inline --raw-leaves outputs the correct hash" '
62+
echo "$ID_HASH0" = "$HASH" &&
63+
test "$ID_HASH0" = "$HASH"
64+
'
65+
66+
test_expect_success "create 1000 bytes file and get its hash" '
67+
random 1000 2 > 1000bytes &&
68+
HASH0=$(ipfs add -q --raw-leaves --only-hash 1000bytes)
69+
'
70+
71+
test_expect_success "ipfs add --inline --raw-leaves works as expected on large file" '
72+
HASH=$(ipfs add -q --inline --raw-leaves 1000bytes)
73+
'
74+
75+
test_expect_success "ipfs add --inline --raw-leaves outputs the correct hash on large file" '
76+
echo "$HASH0" = "$HASH" &&
77+
test "$HASH0" = "$HASH"
78+
'
79+
4680
test_expect_success "enable filestore" '
4781
ipfs config --json Experimental.FilestoreEnabled true
4882
'

0 commit comments

Comments
 (0)
Please sign in to comment.