diff options
Diffstat (limited to 'modules/git/object_format.go')
-rw-r--r-- | modules/git/object_format.go | 79 |
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 } |