]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Expose metainfo.GeneratePieces
authorMatt Joiner <anacrolix@gmail.com>
Wed, 13 May 2020 04:32:20 +0000 (14:32 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 13 May 2020 04:33:26 +0000 (14:33 +1000)
metainfo/info.go
metainfo/pieces.go [new file with mode: 0644]

index 3190dfb018c971d431e4aece486ae83ea71b107a..1c2d0b85b9abef37b32b662fc189c504108b957d 100644 (file)
@@ -1,7 +1,6 @@
 package metainfo
 
 import (
-       "crypto/sha1"
        "errors"
        "fmt"
        "io"
@@ -85,7 +84,7 @@ func (info *Info) writeFiles(w io.Writer, open func(fi FileInfo) (io.ReadCloser,
 
 // Sets Pieces (the block of piece hashes in the Info) by using the passed
 // function to get at the torrent data.
-func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) error {
+func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) (err error) {
        if info.PieceLength == 0 {
                return errors.New("piece length must be non-zero")
        }
@@ -95,26 +94,8 @@ func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error))
                pw.CloseWithError(err)
        }()
        defer pr.Close()
-       var pieces []byte
-       for {
-               hasher := sha1.New()
-               wn, err := io.CopyN(hasher, pr, info.PieceLength)
-               if err == io.EOF {
-                       err = nil
-               }
-               if err != nil {
-                       return err
-               }
-               if wn == 0 {
-                       break
-               }
-               pieces = hasher.Sum(pieces)
-               if wn < info.PieceLength {
-                       break
-               }
-       }
-       info.Pieces = pieces
-       return nil
+       info.Pieces, err = GeneratePieces(pr, info.PieceLength, nil)
+       return
 }
 
 func (info *Info) TotalLength() (ret int64) {
diff --git a/metainfo/pieces.go b/metainfo/pieces.go
new file mode 100644 (file)
index 0000000..812f3f4
--- /dev/null
@@ -0,0 +1,22 @@
+package metainfo
+
+import (
+       "crypto/sha1"
+       "io"
+)
+
+func GeneratePieces(r io.Reader, pieceLength int64, b []byte) ([]byte, error) {
+       for {
+               h := sha1.New()
+               written, err := io.CopyN(h, r, pieceLength)
+               if written > 0 {
+                       b = h.Sum(b)
+               }
+               if err == io.EOF {
+                       return b, nil
+               }
+               if err != nil {
+                       return b, err
+               }
+       }
+}