aboutsummaryrefslogtreecommitdiff
path: root/object/store/packed/internal/ingest/header.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-30 14:28:13 +0000
committerGravatar Runxi Yu2026-03-30 14:28:13 +0000
commita4eeb727468a178a4de0dfc718828f26740484ac (patch)
tree4318d38d49facc80e2e2186f5919fa656be3b31f /object/store/packed/internal/ingest/header.go
parentobject/store/packed: Make store own root, algo, opts (diff)
signatureNo signature
object,store/packed{,/internal/ingest}: Move from format/packfile/ingest
Diffstat (limited to 'object/store/packed/internal/ingest/header.go')
-rw-r--r--object/store/packed/internal/ingest/header.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/object/store/packed/internal/ingest/header.go b/object/store/packed/internal/ingest/header.go
new file mode 100644
index 00000000..6b90becc
--- /dev/null
+++ b/object/store/packed/internal/ingest/header.go
@@ -0,0 +1,54 @@
+package ingest
+
+import (
+ "encoding/binary"
+ "fmt"
+ "io"
+
+ "codeberg.org/lindenii/furgit/format/packfile"
+)
+
+const packHeaderSize = 12
+
+type packHeader struct {
+ Version uint32
+ ObjectCount uint32
+}
+
+// readAndValidatePackHeader reads one PACK header from src and validates it.
+func readAndValidatePackHeader(src io.Reader) (packHeader, [packHeaderSize]byte, error) {
+ var hdr [packHeaderSize]byte
+
+ _, err := io.ReadFull(src, hdr[:])
+ if err != nil {
+ return packHeader{}, [packHeaderSize]byte{}, &InvalidPackHeaderError{
+ Reason: fmt.Sprintf("read header: %v", err),
+ }
+ }
+
+ header, err := parseAndValidatePackHeader(hdr)
+ if err != nil {
+ return packHeader{}, [packHeaderSize]byte{}, err
+ }
+
+ return header, hdr, nil
+}
+
+// parseAndValidatePackHeader validates one already-read PACK header.
+func parseAndValidatePackHeader(hdr [packHeaderSize]byte) (packHeader, error) {
+ if binary.BigEndian.Uint32(hdr[:4]) != packfile.Signature {
+ return packHeader{}, &InvalidPackHeaderError{Reason: "signature mismatch"}
+ }
+
+ version := binary.BigEndian.Uint32(hdr[4:8])
+ if !packfile.SupportedVersion(version) {
+ return packHeader{}, &InvalidPackHeaderError{
+ Reason: fmt.Sprintf("unsupported version %d", version),
+ }
+ }
+
+ return packHeader{
+ Version: version,
+ ObjectCount: binary.BigEndian.Uint32(hdr[8:12]),
+ }, nil
+}