From 06a81fdb64feebec49100f5f9087821a534e91e2 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Thu, 11 Jun 2026 06:12:12 +0000 Subject: internal/format/packfile/delta: Parse ofs-delta backward distance --- internal/format/packfile/delta/doc.go | 2 ++ internal/format/packfile/delta/ofs.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 internal/format/packfile/delta/doc.go create mode 100644 internal/format/packfile/delta/ofs.go (limited to 'internal/format') 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 +} -- cgit v1.3.1-10-gc9f91