/
chunk.go
83 lines (72 loc) · 1.57 KB
/
chunk.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package main
import (
"context"
"crypto/sha512"
"flag"
"fmt"
"io"
"os"
"github.com/folbricht/desync"
"github.com/pkg/errors"
)
const chunkUsage = `desync chunk [options] <file>
Write start/length/hash pairs for each chunk a file is split into.`
func chunkCmd(ctx context.Context, args []string) error {
var (
chunkSize string
startPos uint64
)
flags := flag.NewFlagSet("chunk", flag.ExitOnError)
flags.Usage = func() {
fmt.Fprintln(os.Stderr, chunkUsage)
flags.PrintDefaults()
}
flags.StringVar(&chunkSize, "m", "16:64:256", "Min/Avg/Max chunk size in kb")
flags.Uint64Var(&startPos, "S", 0, "Starting position")
flags.Parse(args)
if flags.NArg() < 1 {
return errors.New("Not enough arguments. See -h for help.")
}
if flags.NArg() > 1 {
return errors.New("Too many arguments. See -h for help.")
}
min, avg, max, err := parseChunkSizeParam(chunkSize)
if err != nil {
return err
}
dataFile := flags.Arg(0)
// Open the blob
f, err := os.Open(dataFile)
if err != nil {
return err
}
defer f.Close()
s, err := f.Seek(int64(startPos), io.SeekStart)
if err != nil {
return err
}
if uint64(s) != startPos {
return fmt.Errorf("requested seek to position %d, but got %d", startPos, s)
}
// Prepare the chunker
c, err := desync.NewChunker(f, min, avg, max)
if err != nil {
return err
}
for {
select {
case <-ctx.Done():
return nil
default:
}
start, b, err := c.Next()
if err != nil {
return err
}
if len(b) == 0 {
return nil
}
sum := sha512.Sum512_256(b)
fmt.Printf("%d\t%d\t%x\n", start+startPos, len(b), sum)
}
}