diff options
| author | 2026-06-11 06:12:12 +0000 | |
|---|---|---|
| committer | 2026-06-11 06:12:12 +0000 | |
| commit | 06a81fdb64feebec49100f5f9087821a534e91e2 (patch) | |
| tree | fa4f47c44d8bbfdd36c2e3be8bb6d66f42d57470 /internal/format | |
| parent | internal/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.go | 2 | ||||
| -rw-r--r-- | internal/format/packfile/delta/ofs.go | 31 |
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 +} |
