summaryrefslogtreecommitdiffstats
path: root/modules/git/object_format.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/git/object_format.go')
-rw-r--r--modules/git/object_format.go79
1 files changed, 37 insertions, 42 deletions
diff --git a/modules/git/object_format.go b/modules/git/object_format.go
index 3c52de772b..ee7e659ed0 100644
--- a/modules/git/object_format.go
+++ b/modules/git/object_format.go
@@ -5,26 +5,17 @@ package git
import (
"crypto/sha1"
- "fmt"
"regexp"
- "strings"
-)
-
-type ObjectFormatID int
-
-const (
- Sha1 ObjectFormatID = iota
)
// sha1Pattern can be used to determine if a string is an valid sha
var sha1Pattern = regexp.MustCompile(`^[0-9a-f]{4,40}$`)
type ObjectFormat interface {
- ID() ObjectFormatID
- String() string
-
- // Empty is the hash of empty git
- Empty() ObjectID
+ // Name returns the name of the object format
+ Name() string
+ // EmptyObjectID creates a new empty ObjectID from an object format hash name
+ EmptyObjectID() ObjectID
// EmptyTree is the hash of an empty tree
EmptyTree() ObjectID
// FullLength is the length of the hash's hex string
@@ -35,67 +26,71 @@ type ObjectFormat interface {
MustIDFromString(s string) ObjectID
NewID(b []byte) (ObjectID, error)
NewIDFromString(s string) (ObjectID, error)
- NewEmptyID() ObjectID
NewHasher() HasherInterface
}
-type Sha1ObjectFormat struct{}
+type Sha1ObjectFormatImpl struct{}
-func (*Sha1ObjectFormat) ID() ObjectFormatID { return Sha1 }
-func (*Sha1ObjectFormat) String() string { return "sha1" }
-func (*Sha1ObjectFormat) Empty() ObjectID { return &Sha1Hash{} }
-func (*Sha1ObjectFormat) EmptyTree() ObjectID {
- return &Sha1Hash{
+var (
+ emptyObjectID = &Sha1Hash{}
+ emptyTree = &Sha1Hash{
0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60,
0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04,
}
+)
+
+func (Sha1ObjectFormatImpl) Name() string { return "sha1" }
+func (Sha1ObjectFormatImpl) EmptyObjectID() ObjectID {
+ return emptyObjectID
+}
+
+func (Sha1ObjectFormatImpl) EmptyTree() ObjectID {
+ return emptyTree
}
-func (*Sha1ObjectFormat) FullLength() int { return 40 }
-func (*Sha1ObjectFormat) IsValid(input string) bool {
+func (Sha1ObjectFormatImpl) FullLength() int { return 40 }
+func (Sha1ObjectFormatImpl) IsValid(input string) bool {
return sha1Pattern.MatchString(input)
}
-func (*Sha1ObjectFormat) MustID(b []byte) ObjectID {
+func (Sha1ObjectFormatImpl) MustID(b []byte) ObjectID {
var id Sha1Hash
copy(id[0:20], b)
return &id
}
-func (h *Sha1ObjectFormat) MustIDFromString(s string) ObjectID {
+func (h Sha1ObjectFormatImpl) MustIDFromString(s string) ObjectID {
return MustIDFromString(h, s)
}
-func (h *Sha1ObjectFormat) NewID(b []byte) (ObjectID, error) {
+func (h Sha1ObjectFormatImpl) NewID(b []byte) (ObjectID, error) {
return IDFromRaw(h, b)
}
-func (h *Sha1ObjectFormat) NewIDFromString(s string) (ObjectID, error) {
+func (h Sha1ObjectFormatImpl) NewIDFromString(s string) (ObjectID, error) {
return genericIDFromString(h, s)
}
-func (*Sha1ObjectFormat) NewEmptyID() ObjectID {
- return NewSha1()
-}
-
-func (h *Sha1ObjectFormat) NewHasher() HasherInterface {
+func (h Sha1ObjectFormatImpl) NewHasher() HasherInterface {
return &Sha1Hasher{sha1.New()}
}
-func ObjectFormatFromID(id ObjectFormatID) ObjectFormat {
- switch id {
- case Sha1:
- return &Sha1ObjectFormat{}
- }
+var Sha1ObjectFormat ObjectFormat = Sha1ObjectFormatImpl{}
- return nil
+var SupportedObjectFormats = []ObjectFormat{
+ Sha1ObjectFormat,
+ // TODO: add sha256
}
-func ObjectFormatFromString(hash string) (ObjectFormat, error) {
- switch strings.ToLower(hash) {
- case "sha1":
- return &Sha1ObjectFormat{}, nil
+func ObjectFormatFromName(name string) ObjectFormat {
+ for _, objectFormat := range SupportedObjectFormats {
+ if name == objectFormat.Name() {
+ return objectFormat
+ }
}
+ return nil
+}
- return nil, fmt.Errorf("unknown hash type: %s", hash)
+func IsValidObjectFormat(name string) bool {
+ return ObjectFormatFromName(name) != nil
}