aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hash.go16
-rw-r--r--packed_write_pack.go15
2 files changed, 17 insertions, 14 deletions
diff --git a/hash.go b/hash.go
index cbaac821..81b269c3 100644
--- a/hash.go
+++ b/hash.go
@@ -4,6 +4,7 @@ import (
"crypto/sha1"
"crypto/sha256"
"encoding/hex"
+ "hash"
)
// maxHashSize MUST be >= the largest supported algorithm size.
@@ -22,6 +23,7 @@ type hashAlgorithmDetails struct {
name string
size int
sum func([]byte) Hash
+ new func() hash.Hash
}
var hashAlgorithmTable = [...]hashAlgorithmDetails{
@@ -36,6 +38,9 @@ var hashAlgorithmTable = [...]hashAlgorithmDetails{
h.algo = hashAlgoSHA1
return h
},
+ new: func() hash.Hash {
+ return sha1.New()
+ },
},
hashAlgoSHA256: {
name: "sha256",
@@ -47,6 +52,9 @@ var hashAlgorithmTable = [...]hashAlgorithmDetails{
h.algo = hashAlgoSHA256
return h
},
+ new: func() hash.Hash {
+ return sha256.New()
+ },
},
}
@@ -76,6 +84,14 @@ func (algo hashAlgorithm) Sum(data []byte) Hash {
return algo.info().sum(data)
}
+func (algo hashAlgorithm) New() (hash.Hash, error) {
+ newFn := algo.info().new
+ if newFn == nil {
+ return nil, ErrInvalidObject
+ }
+ return newFn(), nil
+}
+
// Hash represents a Git object ID.
type Hash struct {
algo hashAlgorithm
diff --git a/packed_write_pack.go b/packed_write_pack.go
index aa5b7aa0..7e79b2ef 100644
--- a/packed_write_pack.go
+++ b/packed_write_pack.go
@@ -2,8 +2,6 @@ package furgit
import (
"crypto/rand"
- "crypto/sha1"
- "crypto/sha256"
"encoding/binary"
"errors"
"hash"
@@ -29,7 +27,7 @@ func newPackWriter(w io.Writer, algo hashAlgorithm, objCount uint32) (*packWrite
if w == nil {
return nil, ErrInvalidObject
}
- h, err := newHashWriter(algo)
+ h, err := algo.New()
if err != nil {
return nil, err
}
@@ -41,17 +39,6 @@ func newPackWriter(w io.Writer, algo hashAlgorithm, objCount uint32) (*packWrite
}, nil
}
-func newHashWriter(algo hashAlgorithm) (hash.Hash, error) {
- switch algo {
- case hashAlgoSHA1:
- return sha1.New(), nil
- case hashAlgoSHA256:
- return sha256.New(), nil
- default:
- return nil, ErrInvalidObject
- }
-}
-
func (pw *packWriter) writePacked(p []byte) error {
if len(p) == 0 {
return nil