mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-09-10 16:31:54 +03:00
61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
// package hash provides a way for managing the
|
|
// underlying hash implementations used across go-git.
|
|
package hash
|
|
|
|
import (
|
|
"crypto"
|
|
"fmt"
|
|
"hash"
|
|
|
|
"github.com/pjbgf/sha1cd"
|
|
)
|
|
|
|
// algos is a map of hash algorithms.
|
|
var algos = map[crypto.Hash]func() hash.Hash{}
|
|
|
|
func init() {
|
|
reset()
|
|
}
|
|
|
|
// reset resets the default algos value. Can be used after running tests
|
|
// that registers new algorithms to avoid side effects.
|
|
func reset() {
|
|
algos[crypto.SHA1] = sha1cd.New
|
|
algos[crypto.SHA256] = crypto.SHA256.New
|
|
}
|
|
|
|
// RegisterHash allows for the hash algorithm used to be overridden.
|
|
// This ensures the hash selection for go-git must be explicit, when
|
|
// overriding the default value.
|
|
func RegisterHash(h crypto.Hash, f func() hash.Hash) error {
|
|
if f == nil {
|
|
return fmt.Errorf("cannot register hash: f is nil")
|
|
}
|
|
|
|
switch h {
|
|
case crypto.SHA1:
|
|
algos[h] = f
|
|
case crypto.SHA256:
|
|
algos[h] = f
|
|
default:
|
|
return fmt.Errorf("unsupported hash function: %v", h)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Hash is the same as hash.Hash. This allows consumers
|
|
// to not having to import this package alongside "hash".
|
|
type Hash interface {
|
|
hash.Hash
|
|
}
|
|
|
|
// New returns a new Hash for the given hash function.
|
|
// It panics if the hash function is not registered.
|
|
func New(h crypto.Hash) Hash {
|
|
hh, ok := algos[h]
|
|
if !ok {
|
|
panic(fmt.Sprintf("hash algorithm not registered: %v", h))
|
|
}
|
|
return hh()
|
|
}
|