ref: 918a17362c8a07221a65d4d60af0667ee7f0dd61
parent: 6e28d6a7ec210349b8c336249ba130422310fecb
author: Runxi Yu <me@runxiyu.org>
date: Sun Feb 22 05:28:29 EST 2026
format/delta/apply, etc.: ReadHeaderSizes should use ByteReader
--- a/format/delta/apply/header.go
+++ b/format/delta/apply/header.go
@@ -6,44 +6,37 @@
)
// 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
}
--- a/objectstore/packed/delta_plan.go
+++ b/objectstore/packed/delta_plan.go
@@ -1,6 +1,7 @@
package packed
import (
+ "bufio"
"fmt"
deltaapply "codeberg.org/lindenii/furgit/format/delta/apply"
@@ -89,7 +90,8 @@
}
defer func() { _ = reader.Close() }()- _, size, err := deltaapply.ReadHeaderSizes(reader)
+ br := bufio.NewReaderSize(reader, 32)
+ _, size, err := deltaapply.ReadHeaderSizes(br)
if err != nil {return 0, err
}
--
⑨