aboutsummaryrefslogtreecommitdiff
path: root/format/pack/ingest/header.go
diff options
context:
space:
mode:
Diffstat (limited to 'format/pack/ingest/header.go')
-rw-r--r--format/pack/ingest/header.go41
1 files changed, 28 insertions, 13 deletions
diff --git a/format/pack/ingest/header.go b/format/pack/ingest/header.go
index fba2b175..76d43bef 100644
--- a/format/pack/ingest/header.go
+++ b/format/pack/ingest/header.go
@@ -3,32 +3,47 @@ package ingest
import (
"encoding/binary"
"fmt"
+ "io"
"codeberg.org/lindenii/furgit/format/pack"
)
-// readAndValidatePackHeader reads and validates PACK header from the stream.
-func readAndValidatePackHeader(state *ingestState) error {
- var hdr [12]byte
+const packHeaderSize = 12
- err := state.stream.readFull(hdr[:])
+// readAndValidatePackHeader reads one PACK header from src and validates it.
+func readAndValidatePackHeader(src io.Reader) (HeaderInfo, [packHeaderSize]byte, error) {
+ var hdr [packHeaderSize]byte
+
+ _, err := io.ReadFull(src, hdr[:])
+ if err != nil {
+ return HeaderInfo{}, [packHeaderSize]byte{}, &InvalidPackHeaderError{
+ Reason: fmt.Sprintf("read header: %v", err),
+ }
+ }
+
+ header, err := parseAndValidatePackHeader(hdr)
if err != nil {
- return &InvalidPackHeaderError{Reason: fmt.Sprintf("read header: %v", err)}
+ return HeaderInfo{}, [packHeaderSize]byte{}, err
}
+ return header, hdr, nil
+}
+
+// parseAndValidatePackHeader validates one already-read PACK header.
+func parseAndValidatePackHeader(hdr [packHeaderSize]byte) (HeaderInfo, error) {
if binary.BigEndian.Uint32(hdr[:4]) != pack.Signature {
- return &InvalidPackHeaderError{Reason: "signature mismatch"}
+ return HeaderInfo{}, &InvalidPackHeaderError{Reason: "signature mismatch"}
}
version := binary.BigEndian.Uint32(hdr[4:8])
if !pack.VersionSupported(version) {
- return &InvalidPackHeaderError{Reason: fmt.Sprintf("unsupported version %d", version)}
- }
-
- state.objectCountHeader = binary.BigEndian.Uint32(hdr[8:12])
- if state.objectCountHeader == 0 {
- return &InvalidPackHeaderError{Reason: "zero objects"}
+ return HeaderInfo{}, &InvalidPackHeaderError{
+ Reason: fmt.Sprintf("unsupported version %d", version),
+ }
}
- return nil
+ return HeaderInfo{
+ Version: version,
+ ObjectCount: binary.BigEndian.Uint32(hdr[8:12]),
+ }, nil
}