aboutsummaryrefslogtreecommitdiff
path: root/format/packfile
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-04-02 06:23:30 +0000
committerGravatar Runxi Yu2026-04-02 06:28:39 +0000
commita041d523de389b65b98a5373a8034041db2a8d83 (patch)
tree7b423dc735f463be616045f2c3c2095a7737aca7 /format/packfile
parentresearch: Add dynamic pack resources (diff)
signatureNo signature
*: Remove
Diffstat (limited to 'format/packfile')
-rw-r--r--format/packfile/delta/apply/apply.go160
-rw-r--r--format/packfile/delta/apply/header.go47
-rw-r--r--format/packfile/delta/doc.go2
-rw-r--r--format/packfile/doc.go5
-rw-r--r--format/packfile/entry.go76
-rw-r--r--format/packfile/entry_header.go52
-rw-r--r--format/packfile/header.go9
-rw-r--r--format/packfile/ofs.go26
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
-}