diff options
| author | 2026-04-02 06:23:30 +0000 | |
|---|---|---|
| committer | 2026-04-02 06:28:39 +0000 | |
| commit | a041d523de389b65b98a5373a8034041db2a8d83 (patch) | |
| tree | 7b423dc735f463be616045f2c3c2095a7737aca7 /format/packfile | |
| parent | research: Add dynamic pack resources (diff) | |
| signature | No signature | |
*: Remove
Diffstat (limited to 'format/packfile')
| -rw-r--r-- | format/packfile/delta/apply/apply.go | 160 | ||||
| -rw-r--r-- | format/packfile/delta/apply/header.go | 47 | ||||
| -rw-r--r-- | format/packfile/delta/doc.go | 2 | ||||
| -rw-r--r-- | format/packfile/doc.go | 5 | ||||
| -rw-r--r-- | format/packfile/entry.go | 76 | ||||
| -rw-r--r-- | format/packfile/entry_header.go | 52 | ||||
| -rw-r--r-- | format/packfile/header.go | 9 | ||||
| -rw-r--r-- | format/packfile/ofs.go | 26 |
8 files changed, 0 insertions, 377 deletions
diff --git a/format/packfile/delta/apply/apply.go b/format/packfile/delta/apply/apply.go deleted file mode 100644 index f5006e3c..00000000 --- a/format/packfile/delta/apply/apply.go +++ /dev/null @@ -1,160 +0,0 @@ -// Package apply applies Git delta instruction streams. -package apply - -import "fmt" - -// Apply applies one Git delta instruction stream to base. -func Apply(base, delta []byte) ([]byte, error) { - pos := 0 - - srcSize, err := readVarint(delta, &pos) - if err != nil { - return nil, err - } - - dstSize, err := readVarint(delta, &pos) - if err != nil { - return nil, err - } - - if srcSize != len(base) { - return nil, fmt.Errorf("delta/apply: delta source size mismatch: got %d want %d", srcSize, len(base)) - } - - out := make([]byte, dstSize) - outPos := 0 - - for pos < len(delta) { - op := delta[pos] - pos++ - - //nolint:nestif - if op&0x80 != 0 { - off := 0 - - if op&0x01 != 0 { - if pos >= len(delta) { - return nil, fmt.Errorf("delta/apply: malformed delta copy offset") - } - - off |= int(delta[pos]) - pos++ - } - - if op&0x02 != 0 { - if pos >= len(delta) { - return nil, fmt.Errorf("delta/apply: malformed delta copy offset") - } - - off |= int(delta[pos]) << 8 - pos++ - } - - if op&0x04 != 0 { - if pos >= len(delta) { - return nil, fmt.Errorf("delta/apply: malformed delta copy offset") - } - - off |= int(delta[pos]) << 16 - pos++ - } - - if op&0x08 != 0 { - if pos >= len(delta) { - return nil, fmt.Errorf("delta/apply: malformed delta copy offset") - } - - off |= int(delta[pos]) << 24 - pos++ - } - - n := 0 - - if op&0x10 != 0 { - if pos >= len(delta) { - return nil, fmt.Errorf("delta/apply: malformed delta copy size") - } - - n |= int(delta[pos]) - pos++ - } - - if op&0x20 != 0 { - if pos >= len(delta) { - return nil, fmt.Errorf("delta/apply: malformed delta copy size") - } - - n |= int(delta[pos]) << 8 - pos++ - } - - if op&0x40 != 0 { - if pos >= len(delta) { - return nil, fmt.Errorf("delta/apply: malformed delta copy size") - } - - n |= int(delta[pos]) << 16 - pos++ - } - - if n == 0 { - n = 0x10000 - } - - if off < 0 || n < 0 || off+n > len(base) || outPos+n > len(out) { - return nil, fmt.Errorf("delta/apply: delta copy out of bounds") - } - - copy(out[outPos:outPos+n], base[off:off+n]) - outPos += n - - continue - } - - if op == 0 { - return nil, fmt.Errorf("delta/apply: invalid delta opcode 0") - } - - n := int(op) - if pos+n > len(delta) || outPos+n > len(out) { - return nil, fmt.Errorf("delta/apply: delta insert out of bounds") - } - - copy(out[outPos:outPos+n], delta[pos:pos+n]) - outPos += n - pos += n - } - - if outPos != len(out) { - return nil, fmt.Errorf("delta/apply: delta output size mismatch: got %d want %d", outPos, len(out)) - } - - return out, nil -} - -// readVarint parses one Git delta varint and advances pos. -func readVarint(buf []byte, pos *int) (int, error) { - value := 0 - shift := uint(0) - - for { - if *pos >= len(buf) { - return 0, fmt.Errorf("delta/apply: malformed delta varint") - } - - b := buf[*pos] - *pos++ - - value |= int(b&0x7f) << shift - if b&0x80 == 0 { - break - } - - shift += 7 - if shift > 63 { - return 0, fmt.Errorf("delta/apply: delta varint overflow") - } - } - - return value, nil -} diff --git a/format/packfile/delta/apply/header.go b/format/packfile/delta/apply/header.go deleted file mode 100644 index 69c9659a..00000000 --- a/format/packfile/delta/apply/header.go +++ /dev/null @@ -1,47 +0,0 @@ -package apply - -import ( - "fmt" - "io" -) - -// ReadHeaderSizes reads the first two varints in one inflated delta stream. -// -// Callers that continue reading the same stream should pass their own buffered -// byte reader and keep using that same reader afterwards. -func ReadHeaderSizes(reader io.ByteReader) (int, int, error) { - srcSize, err := readVarintFromByteReader(reader) - if err != nil { - return 0, 0, err - } - - dstSize, err := readVarintFromByteReader(reader) - if err != nil { - return 0, 0, err - } - - return srcSize, dstSize, nil -} - -// readVarintFromByteReader parses one Git delta varint from reader. -func readVarintFromByteReader(reader io.ByteReader) (int, error) { - value := 0 - shift := uint(0) - - for { - b, err := reader.ReadByte() - if err != nil { - return 0, fmt.Errorf("delta/apply: malformed delta varint: %w", err) - } - - value |= int(b&0x7f) << shift - if b&0x80 == 0 { - return value, nil - } - - shift += 7 - if shift > 63 { - return 0, fmt.Errorf("delta/apply: delta varint overflow") - } - } -} diff --git a/format/packfile/delta/doc.go b/format/packfile/delta/doc.go deleted file mode 100644 index f63c96a8..00000000 --- a/format/packfile/delta/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package delta provides various routines to handle Git delta compression. -package delta diff --git a/format/packfile/doc.go b/format/packfile/doc.go deleted file mode 100644 index cd4aacfc..00000000 --- a/format/packfile/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package packfile provides Git packfile format parsing primitives. -package packfile - -// TODO: This could probably be moved into object/store/packed when we get the pack ingestion semantics right? -// Oh, wait, the other stores might still want pack constants like we provide here. diff --git a/format/packfile/entry.go b/format/packfile/entry.go deleted file mode 100644 index 0f9c7c8d..00000000 --- a/format/packfile/entry.go +++ /dev/null @@ -1,76 +0,0 @@ -package packfile - -import ( - "fmt" - - objecttype "codeberg.org/lindenii/furgit/object/type" -) - -// Entry is one parsed pack entry prefix, including any delta base reference -// data that appears before the compressed payload. -type Entry struct { - // Type is the pack entry type. - Type objecttype.Type - // Size is the declared resulting object size. - Size int64 - // DataOffset is the byte offset from the start of the entry to the zlib - // payload bytes. - DataOffset int - // RefBaseID is the referenced base object ID bytes for ref-delta entries. - RefBaseID []byte - // OfsBaseDistance is the backward distance for ofs-delta entries. - OfsBaseDistance uint64 -} - -// ParseEntry parses one full pack entry prefix from data. -// -// hashSize must match the hash algorithm size used by the pack/index. -func ParseEntry(data []byte, hashSize int) (Entry, error) { - var zero Entry - - header, err := ParseEntryHeader(data) - if err != nil { - return zero, err - } - - entry := Entry{ - Type: header.Type, - Size: header.Size, - DataOffset: header.HeaderSize, - } - - switch entry.Type { - case objecttype.TypeCommit, objecttype.TypeTree, objecttype.TypeBlob, objecttype.TypeTag: - // Base object entries have no extra prefix fields. - case objecttype.TypeRefDelta: - if hashSize <= 0 { - return zero, fmt.Errorf("packfile: invalid hash size %d", hashSize) - } - - end := entry.DataOffset + hashSize - if end > len(data) { - return zero, fmt.Errorf("packfile: truncated ref-delta base id") - } - - entry.RefBaseID = data[entry.DataOffset:end] - entry.DataOffset = end - case objecttype.TypeOfsDelta: - dist, consumed, err := ParseOfsDeltaDistance(data[entry.DataOffset:]) - if err != nil { - return zero, err - } - - entry.OfsBaseDistance = dist - entry.DataOffset += consumed - case objecttype.TypeInvalid, objecttype.TypeFuture: - return zero, fmt.Errorf("packfile: unsupported object type %d", entry.Type) - default: - return zero, fmt.Errorf("packfile: unsupported object type %d", entry.Type) - } - - if entry.DataOffset > len(data) { - return zero, fmt.Errorf("packfile: entry data offset out of bounds") - } - - return entry, nil -} diff --git a/format/packfile/entry_header.go b/format/packfile/entry_header.go deleted file mode 100644 index 05664268..00000000 --- a/format/packfile/entry_header.go +++ /dev/null @@ -1,52 +0,0 @@ -package packfile - -import ( - "fmt" - - objecttype "codeberg.org/lindenii/furgit/object/type" -) - -// 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("packfile: 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("packfile: 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("packfile: negative entry size") - } - - return header, nil -} diff --git a/format/packfile/header.go b/format/packfile/header.go deleted file mode 100644 index 5f4e4508..00000000 --- a/format/packfile/header.go +++ /dev/null @@ -1,9 +0,0 @@ -package packfile - -// Signature is the 4-byte "PACK" magic at the start of pack files. -const Signature = 0x5041434b - -// SupportedVersion reports whether one pack version is supported. -func SupportedVersion(version uint32) bool { - return version == 2 || version == 3 -} diff --git a/format/packfile/ofs.go b/format/packfile/ofs.go deleted file mode 100644 index 4992a506..00000000 --- a/format/packfile/ofs.go +++ /dev/null @@ -1,26 +0,0 @@ -package packfile - -import "fmt" - -// ParseOfsDeltaDistance parses one ofs-delta backward distance. -func ParseOfsDeltaDistance(buf []byte) (uint64, int, error) { - if len(buf) == 0 { - return 0, 0, fmt.Errorf("packfile: 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("packfile: malformed ofs-delta distance") - } - - b = buf[consumed] - consumed++ - dist = ((dist + 1) << 7) + uint64(b&0x7f) - } - - return dist, consumed, nil -} |
