aboutsummaryrefslogtreecommitdiff
path: root/internal/format
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-06-11 06:12:12 +0000
committerGravatar Runxi Yu2026-06-11 06:12:12 +0000
commit06a81fdb64feebec49100f5f9087821a534e91e2 (patch)
treefa4f47c44d8bbfdd36c2e3be8bb6d66f42d57470 /internal/format
parentinternal/format/packfile: Add simple header functions (diff)
internal/format/packfile/delta: Parse ofs-delta backward distance
Diffstat (limited to 'internal/format')
-rw-r--r--internal/format/packfile/delta/doc.go2
-rw-r--r--internal/format/packfile/delta/ofs.go31
2 files changed, 33 insertions, 0 deletions
diff --git a/internal/format/packfile/delta/doc.go b/internal/format/packfile/delta/doc.go
new file mode 100644
index 00000000..f63c96a8
--- /dev/null
+++ b/internal/format/packfile/delta/doc.go
@@ -0,0 +1,2 @@
+// Package delta provides various routines to handle Git delta compression.
+package delta
diff --git a/internal/format/packfile/delta/ofs.go b/internal/format/packfile/delta/ofs.go
new file mode 100644
index 00000000..f11ec1cd
--- /dev/null
+++ b/internal/format/packfile/delta/ofs.go
@@ -0,0 +1,31 @@
+package delta
+
+import (
+ "errors"
+ "fmt"
+)
+
+var ErrMalformedOfsDeltaDistance = errors.New("internal/format/packfile/delta: malformed ofs-delta distance")
+
+// ParseOfsDeltaDistance parses an ofs-delta backward distance.
+func ParseOfsDeltaDistance(buf []byte) (dist uint64, consumed int, err error) {
+ if len(buf) == 0 {
+ return 0, 0, ErrMalformedOfsDeltaDistance
+ }
+
+ b := buf[0]
+ dist = uint64(b & 0x7f)
+
+ consumed = 1
+ for b&0x80 != 0 {
+ if consumed >= len(buf) {
+ return 0, 0, fmt.Errorf("")
+ }
+
+ b = buf[consumed]
+ consumed++
+ dist = ((dist + 1) << 7) + uint64(b&0x7f)
+ }
+
+ return dist, consumed, ErrMalformedOfsDeltaDistance
+}