aboutsummaryrefslogtreecommitdiff
path: root/format
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-22 10:28:29 +0800
committerGravatar Runxi Yu2026-02-22 10:28:29 +0800
commit918a17362c8a07221a65d4d60af0667ee7f0dd61 (patch)
tree64bf9e1c95d3cec54e732e0d8a047550fd5365fe /format
parentobjectstore/packed: Pre-allocate instead of ReadAll (diff)
signatureNo signature
format/delta/apply, etc.: ReadHeaderSizes should use ByteReader
Diffstat (limited to 'format')
-rw-r--r--format/delta/apply/header.go53
1 files changed, 23 insertions, 30 deletions
diff --git a/format/delta/apply/header.go b/format/delta/apply/header.go
index f6aadea3..996b006b 100644
--- a/format/delta/apply/header.go
+++ b/format/delta/apply/header.go
@@ -6,44 +6,37 @@ import (
)
// ReadHeaderSizes reads the first two varints in one inflated delta stream.
-func ReadHeaderSizes(reader io.Reader) (int, int, error) {
- // Two Git varints are read here. Each can take up to 10 bytes.
- var buf [20]byte
- n := 0
-
- for {
- if n >= len(buf) {
- return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint")
- }
- if _, err := io.ReadFull(reader, buf[n:n+1]); err != nil {
- return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint: %w", err)
- }
- n++
- if buf[n-1]&0x80 == 0 {
- break
- }
+//
+// 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
}
- pos := 0
- srcSize, err := readVarint(buf[:n], &pos)
+ 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 {
- if n >= len(buf) {
- return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint")
+ b, err := reader.ReadByte()
+ if err != nil {
+ return 0, fmt.Errorf("format/delta/apply: malformed delta varint: %w", err)
}
- if _, err := io.ReadFull(reader, buf[n:n+1]); err != nil {
- return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint: %w", err)
+ value |= int(b&0x7f) << shift
+ if b&0x80 == 0 {
+ return value, nil
}
- n++
- if buf[n-1]&0x80 == 0 {
- break
+ shift += 7
+ if shift > 63 {
+ return 0, fmt.Errorf("format/delta/apply: delta varint overflow")
}
}
- dstSize, err := readVarint(buf[:n], &pos)
- if err != nil {
- return 0, 0, err
- }
- return srcSize, dstSize, nil
}