aboutsummaryrefslogtreecommitdiffstats
path: root/modules/git/object_format.go
diff options
context:
space:
mode:
authorAdam Majer <amajer@suse.de>2024-01-19 16:05:02 +0000
committerGitHub <noreply@github.com>2024-01-19 17:05:02 +0100
commitd68a613ba8fd860863a3465b5b5945b191b87b25 (patch)
tree396500b05a2454e638174ba274f975958ea94be9 /modules/git/object_format.go
parent07ba4d9f87cf21b7ce87158ae5651cae3bb35604 (diff)
downloadgitea-d68a613ba8fd860863a3465b5b5945b191b87b25.tar.gz
gitea-d68a613ba8fd860863a3465b5b5945b191b87b25.zip
Add support for sha256 repositories (#23894)
Currently only SHA1 repositories are supported by Gitea. This adds support for alternate SHA256 with the additional aim of easier support for additional hash types in the future. Fixes: #13794 Limited by: https://github.com/go-git/go-git/issues/899 Depend on: #28138 <img width="776" alt="图片" src="https://github.com/go-gitea/gitea/assets/81045/5448c9a7-608e-4341-a149-5dd0069c9447"> --------- Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: 6543 <6543@obermui.de>
Diffstat (limited to 'modules/git/object_format.go')
-rw-r--r--modules/git/object_format.go65
1 files changed, 59 insertions, 6 deletions
diff --git a/modules/git/object_format.go b/modules/git/object_format.go
index 27771e7459..a056b20e8a 100644
--- a/modules/git/object_format.go
+++ b/modules/git/object_format.go
@@ -5,6 +5,7 @@ package git
import (
"crypto/sha1"
+ "crypto/sha256"
"regexp"
"strconv"
)
@@ -12,6 +13,9 @@ import (
// sha1Pattern can be used to determine if a string is an valid sha
var sha1Pattern = regexp.MustCompile(`^[0-9a-f]{4,40}$`)
+// sha256Pattern can be used to determine if a string is an valid sha
+var sha256Pattern = regexp.MustCompile(`^[0-9a-f]{4,64}$`)
+
type ObjectFormat interface {
// Name returns the name of the object format
Name() string
@@ -29,11 +33,12 @@ type ObjectFormat interface {
ComputeHash(t ObjectType, content []byte) ObjectID
}
+/* SHA1 Type */
type Sha1ObjectFormatImpl struct{}
var (
- emptyObjectID = &Sha1Hash{}
- emptyTree = &Sha1Hash{
+ emptySha1ObjectID = &Sha1Hash{}
+ emptySha1Tree = &Sha1Hash{
0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60,
0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04,
}
@@ -41,11 +46,11 @@ var (
func (Sha1ObjectFormatImpl) Name() string { return "sha1" }
func (Sha1ObjectFormatImpl) EmptyObjectID() ObjectID {
- return emptyObjectID
+ return emptySha1ObjectID
}
func (Sha1ObjectFormatImpl) EmptyTree() ObjectID {
- return emptyTree
+ return emptySha1Tree
}
func (Sha1ObjectFormatImpl) FullLength() int { return 40 }
func (Sha1ObjectFormatImpl) IsValid(input string) bool {
@@ -72,11 +77,59 @@ func (h Sha1ObjectFormatImpl) ComputeHash(t ObjectType, content []byte) ObjectID
return &sha1
}
-var Sha1ObjectFormat ObjectFormat = Sha1ObjectFormatImpl{}
+/* SHA256 Type */
+type Sha256ObjectFormatImpl struct{}
+
+var (
+ emptySha256ObjectID = &Sha256Hash{}
+ emptySha256Tree = &Sha256Hash{
+ 0x6e, 0xf1, 0x9b, 0x41, 0x22, 0x5c, 0x53, 0x69, 0xf1, 0xc1,
+ 0x04, 0xd4, 0x5d, 0x8d, 0x85, 0xef, 0xa9, 0xb0, 0x57, 0xb5,
+ 0x3b, 0x14, 0xb4, 0xb9, 0xb9, 0x39, 0xdd, 0x74, 0xde, 0xcc,
+ 0x53, 0x21,
+ }
+)
+
+func (Sha256ObjectFormatImpl) Name() string { return "sha256" }
+func (Sha256ObjectFormatImpl) EmptyObjectID() ObjectID {
+ return emptySha256ObjectID
+}
+
+func (Sha256ObjectFormatImpl) EmptyTree() ObjectID {
+ return emptySha256Tree
+}
+func (Sha256ObjectFormatImpl) FullLength() int { return 64 }
+func (Sha256ObjectFormatImpl) IsValid(input string) bool {
+ return sha256Pattern.MatchString(input)
+}
+
+func (Sha256ObjectFormatImpl) MustID(b []byte) ObjectID {
+ var id Sha256Hash
+ copy(id[0:32], b)
+ return &id
+}
+
+// ComputeHash compute the hash for a given ObjectType and content
+func (h Sha256ObjectFormatImpl) ComputeHash(t ObjectType, content []byte) ObjectID {
+ hasher := sha256.New()
+ _, _ = hasher.Write(t.Bytes())
+ _, _ = hasher.Write([]byte(" "))
+ _, _ = hasher.Write([]byte(strconv.FormatInt(int64(len(content)), 10)))
+ _, _ = hasher.Write([]byte{0})
+
+ // HashSum generates a SHA256 for the provided hash
+ var sha256 Sha1Hash
+ copy(sha256[:], hasher.Sum(nil))
+ return &sha256
+}
+
+var (
+ Sha1ObjectFormat ObjectFormat = Sha1ObjectFormatImpl{}
+ Sha256ObjectFormat ObjectFormat = Sha256ObjectFormatImpl{}
+)
var SupportedObjectFormats = []ObjectFormat{
Sha1ObjectFormat,
- // TODO: add sha256
}
func ObjectFormatFromName(name string) ObjectFormat {