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 52aacb6

Browse files
committedAug 8, 2015
move chunker type parsing into its own file in chunk
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
1 parent 3f33df1 commit 52aacb6

File tree

3 files changed

+77
-51
lines changed

3 files changed

+77
-51
lines changed
 

‎core/commands/add.go

+1-50
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package commands
22

33
import (
4-
"errors"
54
"fmt"
65
"io"
76
"path"
8-
"strconv"
9-
"strings"
107

118
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/cheggaaa/pb"
129

@@ -275,55 +272,9 @@ type adder struct {
275272
chunker string
276273
}
277274

278-
func getChunker(r io.Reader, chunker string) (chunk.Splitter, error) {
279-
switch {
280-
case chunker == "":
281-
return chunk.NewSizeSplitter(r, chunk.DefaultBlockSize), nil
282-
case strings.HasPrefix(chunker, "size-"):
283-
sizeStr := strings.Split(chunker, "-")[1]
284-
size, err := strconv.Atoi(sizeStr)
285-
if err != nil {
286-
return nil, err
287-
}
288-
289-
return chunk.NewSizeSplitter(r, int64(size)), nil
290-
case strings.HasPrefix(chunker, "rabin"):
291-
parts := strings.Split(chunker, "-")
292-
switch len(parts) {
293-
case 1:
294-
return chunk.NewRabin(r, uint64(chunk.DefaultBlockSize)), nil
295-
case 2:
296-
size, err := strconv.Atoi(parts[1])
297-
if err != nil {
298-
return nil, err
299-
}
300-
return chunk.NewRabin(r, uint64(size)), nil
301-
case 4:
302-
min, err := strconv.Atoi(parts[1])
303-
if err != nil {
304-
return nil, err
305-
}
306-
avg, err := strconv.Atoi(parts[2])
307-
if err != nil {
308-
return nil, err
309-
}
310-
max, err := strconv.Atoi(parts[3])
311-
if err != nil {
312-
return nil, err
313-
}
314-
315-
return chunk.NewRabinMinMax(r, uint64(min), uint64(avg), uint64(max)), nil
316-
default:
317-
return nil, errors.New("incorrect format (expected 'rabin' 'rabin-[avg]' or 'rabin-[min]-[avg]-[max]'")
318-
}
319-
default:
320-
return nil, fmt.Errorf("unrecognized chunker option: %s", chunker)
321-
}
322-
}
323-
324275
// Perform the actual add & pin locally, outputting results to reader
325276
func add(n *core.IpfsNode, reader io.Reader, useTrickle bool, chunker string) (*dag.Node, error) {
326-
chnk, err := getChunker(reader, chunker)
277+
chnk, err := chunk.FromString(reader, chunker)
327278
if err != nil {
328279
return nil, err
329280
}

‎fuse/readonly/ipfs_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func randObj(t *testing.T, nd *core.IpfsNode, size int64) (*dag.Node, []byte) {
3636
buf := make([]byte, size)
3737
u.NewTimeSeededRand().Read(buf)
3838
read := bytes.NewReader(buf)
39-
obj, err := importer.BuildTrickleDagFromReader(read, nd.DAG, chunk.DefaultSplitter, nil)
39+
obj, err := importer.BuildTrickleDagFromReader(nd.DAG, chunk.DefaultSplitter(read), nil)
4040
if err != nil {
4141
t.Fatal(err)
4242
}

‎importer/chunk/parse.go

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package chunk
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"io"
7+
"strconv"
8+
"strings"
9+
)
10+
11+
func FromString(r io.Reader, chunker string) (Splitter, error) {
12+
switch {
13+
case chunker == "" || chunker == "default":
14+
return NewSizeSplitter(r, DefaultBlockSize), nil
15+
16+
case strings.HasPrefix(chunker, "size-"):
17+
sizeStr := strings.Split(chunker, "-")[1]
18+
size, err := strconv.Atoi(sizeStr)
19+
if err != nil {
20+
return nil, err
21+
}
22+
return NewSizeSplitter(r, int64(size)), nil
23+
24+
case strings.HasPrefix(chunker, "rabin"):
25+
return parseRabinString(r, chunker)
26+
27+
default:
28+
return nil, fmt.Errorf("unrecognized chunker option: %s", chunker)
29+
}
30+
}
31+
32+
func parseRabinString(r io.Reader, chunker string) (Splitter, error) {
33+
parts := strings.Split(chunker, "-")
34+
switch len(parts) {
35+
case 1:
36+
return NewRabin(r, uint64(DefaultBlockSize)), nil
37+
case 2:
38+
size, err := strconv.Atoi(parts[1])
39+
if err != nil {
40+
return nil, err
41+
}
42+
return NewRabin(r, uint64(size)), nil
43+
case 4:
44+
sub := strings.Split(parts[1], ":")
45+
if len(sub) > 1 && sub[0] != "min" {
46+
return nil, errors.New("first label must be min")
47+
}
48+
min, err := strconv.Atoi(sub[len(sub)-1])
49+
if err != nil {
50+
return nil, err
51+
}
52+
53+
sub = strings.Split(parts[1], ":")
54+
if len(sub) > 1 && sub[0] != "avg" {
55+
return nil, errors.New("second label must be avg")
56+
}
57+
avg, err := strconv.Atoi(sub[len(sub)-1])
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
sub = strings.Split(parts[1], ":")
63+
if len(sub) > 1 && sub[0] != "max" {
64+
return nil, errors.New("final label must be max")
65+
}
66+
max, err := strconv.Atoi(parts[3])
67+
if err != nil {
68+
return nil, err
69+
}
70+
71+
return NewRabinMinMax(r, uint64(min), uint64(avg), uint64(max)), nil
72+
default:
73+
return nil, errors.New("incorrect format (expected 'rabin' 'rabin-[avg]' or 'rabin-[min]-[avg]-[max]'")
74+
}
75+
}

0 commit comments

Comments
 (0)
Please sign in to comment.