aboutsummaryrefslogtreecommitdiff
path: root/format/packfile/ingest/distance.go
diff options
context:
space:
mode:
Diffstat (limited to 'format/packfile/ingest/distance.go')
-rw-r--r--format/packfile/ingest/distance.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/format/packfile/ingest/distance.go b/format/packfile/ingest/distance.go
new file mode 100644
index 00000000..9bc4d886
--- /dev/null
+++ b/format/packfile/ingest/distance.go
@@ -0,0 +1,30 @@
+package ingest
+
+import (
+ "fmt"
+ "io"
+)
+
+// readOfsDistanceFromStream reads one ofs-delta encoded distance.
+func readOfsDistanceFromStream(reader io.ByteReader) (uint64, int, error) {
+ first, err := reader.ReadByte()
+ if err != nil {
+ return 0, 0, fmt.Errorf("read ofs distance first byte: %w", err)
+ }
+
+ dist := uint64(first & 0x7f)
+ consumed := 1
+
+ b := first
+ for b&0x80 != 0 {
+ b, err = reader.ReadByte()
+ if err != nil {
+ return 0, 0, fmt.Errorf("read ofs distance continuation: %w", err)
+ }
+
+ consumed++
+ dist = ((dist + 1) << 7) + uint64(b&0x7f)
+ }
+
+ return dist, consumed, nil
+}