aboutsummaryrefslogtreecommitdiffstats
path: root/repository/hash.go
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2020-07-01 19:39:02 +0200
committerMichael Muré <batolettre@gmail.com>2020-07-01 19:39:02 +0200
commit3cf31fc4049fefc82db0a3d2018b5d98ab77c5d7 (patch)
treec77a29e1f35fefa5040454976c6edcf86e7678bc /repository/hash.go
parent33d510ac3999b3d8fa7a4652dc44a21c713f97de (diff)
downloadgit-bug-3cf31fc4049fefc82db0a3d2018b5d98ab77c5d7.tar.gz
repository: merge git.Hash in for one less /util package
Diffstat (limited to 'repository/hash.go')
-rw-r--r--repository/hash.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/repository/hash.go b/repository/hash.go
new file mode 100644
index 00000000..6a11558f
--- /dev/null
+++ b/repository/hash.go
@@ -0,0 +1,51 @@
+package repository
+
+import (
+ "fmt"
+ "io"
+)
+
+const idLengthSHA1 = 40
+const idLengthSHA256 = 64
+
+// Hash is a git hash
+type Hash string
+
+func (h Hash) String() string {
+ return string(h)
+}
+
+// UnmarshalGQL implement the Unmarshaler interface for gqlgen
+func (h *Hash) UnmarshalGQL(v interface{}) error {
+ _, ok := v.(string)
+ if !ok {
+ return fmt.Errorf("hashes must be strings")
+ }
+
+ *h = v.(Hash)
+
+ if !h.IsValid() {
+ return fmt.Errorf("invalid hash")
+ }
+
+ return nil
+}
+
+// MarshalGQL implement the Marshaler interface for gqlgen
+func (h Hash) MarshalGQL(w io.Writer) {
+ _, _ = w.Write([]byte(`"` + h.String() + `"`))
+}
+
+// IsValid tell if the hash is valid
+func (h *Hash) IsValid() bool {
+ // Support for both sha1 and sha256 git hashes
+ if len(*h) != idLengthSHA1 && len(*h) != idLengthSHA256 {
+ return false
+ }
+ for _, r := range *h {
+ if (r < 'a' || r > 'z') && (r < '0' || r > '9') {
+ return false
+ }
+ }
+ return true
+}