ref: dc634ee5daef8268203b26c1b14ab59c11f7f59c
dir: /format/pack/ingest/header.go/
package ingest
import (
"encoding/binary"
"fmt"
"codeberg.org/lindenii/furgit/format/pack"
)
// readAndValidatePackHeader reads and validates PACK header from the stream.
func readAndValidatePackHeader(state *ingestState) error {
var hdr [12]byte
err := state.stream.readFull(hdr[:])
if err != nil {
return &InvalidPackHeaderError{Reason: fmt.Sprintf("read header: %v", err)}
}
if binary.BigEndian.Uint32(hdr[:4]) != pack.Signature {
return &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 nil
}