aboutsummaryrefslogtreecommitdiffstats
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.go103
1 files changed, 103 insertions, 0 deletions
diff --git a/modules/git/object_format.go b/modules/git/object_format.go
new file mode 100644
index 0000000000..7f5d09170c
--- /dev/null
+++ b/modules/git/object_format.go
@@ -0,0 +1,103 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+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
+ // EmptyTree is the hash of an empty tree
+ EmptyTree() ObjectID
+ // FullLength is the length of the hash's hex string
+ FullLength() int
+
+ IsValid(input string) bool
+ MustID(b []byte) ObjectID
+ MustIDFromString(s string) ObjectID
+ NewID(b []byte) (ObjectID, error)
+ NewIDFromString(s string) (ObjectID, error)
+ NewEmptyID() ObjectID
+
+ NewHasher() HasherInterface
+}
+
+/* SHA1 Type */
+type Sha1ObjectFormat 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{
+ 0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60,
+ 0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04,
+ }
+}
+func (*Sha1ObjectFormat) FullLength() int { return 40 }
+func (*Sha1ObjectFormat) IsValid(input string) bool {
+ return sha1Pattern.MatchString(input)
+}
+
+func (*Sha1ObjectFormat) MustID(b []byte) ObjectID {
+ var id Sha1Hash
+ copy(id[0:20], b)
+ return &id
+}
+
+func (h *Sha1ObjectFormat) MustIDFromString(s string) ObjectID {
+ return MustIDFromString(h, s)
+}
+
+func (h *Sha1ObjectFormat) NewID(b []byte) (ObjectID, error) {
+ return IDFromRaw(h, b)
+}
+
+func (h *Sha1ObjectFormat) NewIDFromString(s string) (ObjectID, error) {
+ return genericIDFromString(h, s)
+}
+
+func (*Sha1ObjectFormat) NewEmptyID() ObjectID {
+ return NewSha1()
+}
+
+func (h *Sha1ObjectFormat) NewHasher() HasherInterface {
+ return &Sha1Hasher{sha1.New()}
+}
+
+// utils
+func ObjectFormatFromID(id ObjectFormatID) ObjectFormat {
+ switch id {
+ case Sha1:
+ return &Sha1ObjectFormat{}
+ }
+
+ return nil
+}
+
+func ObjectFormatFromString(hash string) (ObjectFormat, error) {
+ switch strings.ToLower(hash) {
+ case "sha1":
+ return &Sha1ObjectFormat{}, nil
+ }
+
+ return nil, fmt.Errorf("unknown hash type: %s", hash)
+}