aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-05-16 08:29:46 +0000
committerGravatar Runxi Yu2026-05-16 08:30:11 +0000
commit62d363f044dbcd5dbdf447a0f3ce4c12b8ab30e4 (patch)
tree17bd09f235f9c95a9690e8ed7af405121347fd61
parentobject/typ: Simplify (diff)
signatureNo signature
object/header: Refactor
-rw-r--r--REFACTOR1
-rw-r--r--object/header/append.go23
-rw-r--r--object/header/encode.go8
-rw-r--r--object/header/parse.go25
4 files changed, 23 insertions, 34 deletions
diff --git a/REFACTOR b/REFACTOR
index d72d6124..55ecd95f 100644
--- a/REFACTOR
+++ b/REFACTOR
@@ -47,7 +47,6 @@ object
object/blob
object/commit
object/fetch
-object/header
object/signature
object/signed
object/signed/commit
diff --git a/object/header/append.go b/object/header/append.go
index d1e98672..d79016a0 100644
--- a/object/header/append.go
+++ b/object/header/append.go
@@ -1,25 +1,20 @@
package header
import (
+ "slices"
"strconv"
"codeberg.org/lindenii/furgit/object/typ"
)
// AppendHeader appends a canonical loose-object header ("type size\x00") to dst.
-func AppendHeader(dst []byte, ty typ.Type, size uint64) ([]byte, bool) {
- tyName, ok := ty.Name()
- if !ok {
- return nil, false
- }
+func AppendHeader(dst []byte, ty typ.Type, size uint64) ([]byte) {
+ tyName := ty.Name()
- sizeStr := strconv.FormatInt(size, 10)
- out := make([]byte, 0, len(dst)+len(tyName)+len(sizeStr)+2)
- out = append(out, dst...)
- out = append(out, tyName...)
- out = append(out, ' ')
- out = append(out, sizeStr...)
- out = append(out, 0)
-
- return out, true
+ dst = slices.Grow(dst, len(tyName)+1+19+1)
+ dst = append(dst, tyName...)
+ dst = append(dst, ' ')
+ dst = strconv.AppendUint(dst, size, 10)
+ dst = append(dst, 0)
+ return dst
}
diff --git a/object/header/encode.go b/object/header/encode.go
deleted file mode 100644
index 4cd8599c..00000000
--- a/object/header/encode.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package header
-
-import "codeberg.org/lindenii/furgit/object/typ"
-
-// Encode returns a canonical loose-object header ("type size\x00").
-func Encode(ty typ.Type, size int64) ([]byte, bool) {
- return Append(nil, ty, size)
-}
diff --git a/object/header/parse.go b/object/header/parse.go
index 77deef38..7fb3ed04 100644
--- a/object/header/parse.go
+++ b/object/header/parse.go
@@ -2,39 +2,42 @@ package header
import (
"bytes"
+ "errors"
"strconv"
"codeberg.org/lindenii/furgit/object/typ"
)
+var ErrInvalidHeader = errors.New("object/header: invalid header")
+
// Parse parses a canonical loose-object header ("type size\x00").
-func Parse(data []byte) (ty typ.Type, size int64, consumed int, ok bool) {
+func Parse(data []byte) (ty typ.Type, size uint64, consumed int, err error) {
space := bytes.IndexByte(data, ' ')
if space <= 0 {
- return typ.TypeInvalid, 0, 0, false
+ return 0, 0, 0, ErrInvalidHeader
}
nulRel := bytes.IndexByte(data[space+1:], 0)
if nulRel < 0 {
- return typ.TypeInvalid, 0, 0, false
+ return 0, 0, 0, ErrInvalidHeader
}
nul := space + 1 + nulRel
- ty, ok = typ.Parse(string(data[:space]))
- if !ok {
- return typ.TypeInvalid, 0, 0, false
+ ty, err = typ.Parse(string(data[:space]))
+ if err != nil {
+ return 0, 0, 0, ErrInvalidHeader
}
sizeBytes := data[space+1 : nul]
if len(sizeBytes) == 0 {
- return typ.TypeInvalid, 0, 0, false
+ return 0, 0, 0, ErrInvalidHeader
}
- size, err := strconv.ParseInt(string(sizeBytes), 10, 64)
- if err != nil || size < 0 {
- return typ.TypeInvalid, 0, 0, false
+ size, err = strconv.ParseUint(string(sizeBytes), 10, 64)
+ if err != nil {
+ return 0, 0, 0, ErrInvalidHeader
}
- return ty, size, nul + 1, true
+ return ty, size, nul + 1, nil
}