ref: ffd8a66b3a1dcf16c574af736b3582b0611d288e
parent: 42ff39c8d340dabce79c4057a07a3932da295772
author: Runxi Yu <me@runxiyu.org>
date: Sat Feb 21 13:52:58 EST 2026
format/pack: Extract general constants and such from objectstore/packed
--- /dev/null
+++ b/format/pack/entry.go
@@ -1,0 +1,48 @@
+package pack
+
+import (
+ "fmt"
+
+ "codeberg.org/lindenii/furgit/objecttype"
+)
+
+// EntryHeader is one parsed pack entry header prefix.
+type EntryHeader struct {+ // Type is the entry type tag from the first header byte.
+ Type objecttype.Type
+ // Size is the declared resulting object size.
+ Size int64
+ // HeaderSize is the number of bytes consumed by the type/size header.
+ HeaderSize int
+}
+
+// ParseEntryHeader parses one pack entry type/size header from data.
+func ParseEntryHeader(data []byte) (EntryHeader, error) {+ var zero EntryHeader
+ if len(data) == 0 {+ return zero, fmt.Errorf("format/pack: truncated entry header")+ }
+
+ first := data[0]
+ header := EntryHeader{+ Type: objecttype.Type((first >> 4) & 0x07),
+ Size: int64(first & 0x0f),
+ HeaderSize: 1,
+ }
+
+ shift := uint(4)
+ b := first
+ for b&0x80 != 0 {+ if header.HeaderSize >= len(data) {+ return zero, fmt.Errorf("format/pack: truncated entry header")+ }
+ b = data[header.HeaderSize]
+ header.HeaderSize++
+ header.Size |= int64(b&0x7f) << shift
+ shift += 7
+ }
+ if header.Size < 0 {+ return zero, fmt.Errorf("format/pack: negative entry size")+ }
+ return header, nil
+}
--- /dev/null
+++ b/format/pack/pack.go
@@ -1,0 +1,48 @@
+// Package pack provides Git packfile format parsing primitives.
+package pack
+
+import (
+ "fmt"
+
+ "codeberg.org/lindenii/furgit/objecttype"
+)
+
+// Signature is the 4-byte "PACK" magic at the start of pack files.
+const Signature = 0x5041434b
+
+// VersionSupported reports whether one pack version is supported.
+func VersionSupported(version uint32) bool {+ return version == 2 || version == 3
+}
+
+// IsBaseObjectType reports whether ty is one of the four canonical object
+// types encoded directly in pack entries.
+func IsBaseObjectType(ty objecttype.Type) bool {+ switch ty {+ case objecttype.TypeCommit, objecttype.TypeTree, objecttype.TypeBlob, objecttype.TypeTag:
+ return true
+ case objecttype.TypeInvalid, objecttype.TypeFuture, objecttype.TypeOfsDelta, objecttype.TypeRefDelta:
+ return false
+ default:
+ return false
+ }
+}
+
+// ParseOfsDeltaDistance parses one ofs-delta backward distance.
+func ParseOfsDeltaDistance(buf []byte) (uint64, int, error) {+ if len(buf) == 0 {+ return 0, 0, fmt.Errorf("format/pack: malformed ofs-delta distance")+ }
+ b := buf[0]
+ dist := uint64(b & 0x7f)
+ consumed := 1
+ for b&0x80 != 0 {+ if consumed >= len(buf) {+ return 0, 0, fmt.Errorf("format/pack: malformed ofs-delta distance")+ }
+ b = buf[consumed]
+ consumed++
+ dist = ((dist + 1) << 7) + uint64(b&0x7f)
+ }
+ return dist, consumed, nil
+}
--
⑨