shithub: furgit

Download patch

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
 	}
--