shithub: furgit

Download patch

ref: 4e4b630fe88b0f5c1f6f934a760632b9efbeaaf0
parent: d8389afd387e5b254db1b5ba6c9d7572428ae390
author: Runxi Yu <me@runxiyu.org>
date: Fri Feb 20 07:49:27 EST 2026

Revert "packed: Cleanup"

This reverts commit 45da63f4d0fd94e5a8b11fc6aa8b626338dcabf8.

--- a/packed_read_idx.go
+++ b/packed_read_idx.go
@@ -2,7 +2,6 @@
 
 import (
 	"bytes"
-	"encoding/binary"
 	"errors"
 	"fmt"
 	"os"
@@ -147,10 +146,10 @@
 	if len(buf) < 8+256*4 {
 		return ErrInvalidObject
 	}
-	if binary.BigEndian.Uint32(buf[0:4]) != idxMagic {
+	if readBE32(buf[0:4]) != idxMagic {
 		return ErrInvalidObject
 	}
-	if binary.BigEndian.Uint32(buf[4:8]) != idxVersion2 {
+	if readBE32(buf[4:8]) != idxVersion2 {
 		return ErrInvalidObject
 	}
 
@@ -161,7 +160,7 @@
 		return ErrInvalidObject
 	}
 	pi.fanout = buf[fanoutStart:fanoutEnd]
-	nobj := int(binary.BigEndian.Uint32(pi.fanout[len(pi.fanout)-4:]))
+	nobj := int(readBE32(pi.fanout[len(pi.fanout)-4:]))
 
 	namesStart := fanoutEnd
 	namesEnd := namesStart + nobj*pi.repo.hashAlgo.Size()
@@ -200,6 +199,19 @@
 	return nil
 }
 
+func readBE32(b []byte) uint32 {
+	_ = b[3]
+	return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
+}
+
+func readBE64(b []byte) uint64 {
+	_ = b[7]
+	return (uint64(b[0]) << 56) | (uint64(b[1]) << 48) |
+		(uint64(b[2]) << 40) | (uint64(b[3]) << 32) |
+		(uint64(b[4]) << 24) | (uint64(b[5]) << 16) |
+		(uint64(b[6]) << 8) | uint64(b[7])
+}
+
 func (pi *packIndex) fanoutEntry(i int) uint32 {
 	if len(pi.fanout) == 0 {
 		return 0
@@ -209,12 +221,12 @@
 		return 0
 	}
 	start := i * 4
-	return binary.BigEndian.Uint32(pi.fanout[start : start+4])
+	return readBE32(pi.fanout[start : start+4])
 }
 
 func (pi *packIndex) offset(idx int) (uint64, error) {
 	start := idx * 4
-	word := binary.BigEndian.Uint32(pi.offset32[start : start+4])
+	word := readBE32(pi.offset32[start : start+4])
 	if word&0x80000000 == 0 {
 		return uint64(word), nil
 	}
@@ -224,7 +236,7 @@
 		return 0, errors.New("furgit: pack: corrupt 64-bit offset table")
 	}
 	base := pos * 8
-	return binary.BigEndian.Uint64(pi.offset64[base : base+8]), nil
+	return readBE64(pi.offset64[base : base+8]), nil
 }
 
 func (pi *packIndex) lookup(id Hash) (packlocation, error) {
--- a/packed_write_test.go
+++ b/packed_write_test.go
@@ -3,7 +3,6 @@
 import (
 	"bytes"
 	"crypto/rand"
-	"encoding/binary"
 	"fmt"
 	"os"
 	"os/exec"
@@ -366,7 +365,7 @@
 	if len(data) < 12 {
 		return ErrInvalidObject
 	}
-	if binary.BigEndian.Uint32(data[0:4]) != packMagic || binary.BigEndian.Uint32(data[4:8]) != packVersion2 {
+	if readBE32(data[0:4]) != packMagic || readBE32(data[4:8]) != packVersion2 {
 		return ErrInvalidObject
 	}
 	pos := 12
@@ -434,15 +433,10 @@
 			if baseBody == nil {
 				return fmt.Errorf("obj %d missing base body", i)
 			}
-			pos := 0
-			baseSize, err := packVarintRead(payload, &pos)
+			baseSize, resultSize, err := readDeltaSizes(payload)
 			if err != nil {
-				return fmt.Errorf("obj %d delta base size: %v", i, err)
+				return fmt.Errorf("obj %d delta sizes: %v", i, err)
 			}
-			resultSize, err := packVarintRead(payload, &pos)
-			if err != nil {
-				return fmt.Errorf("obj %d delta result size: %v", i, err)
-			}
 			if baseSize != len(baseBody) {
 				return fmt.Errorf("obj %d delta base size mismatch: got %d want %d", i, baseSize, len(baseBody))
 			}
@@ -460,15 +454,10 @@
 			if baseBody == nil {
 				return fmt.Errorf("obj %d missing ref base body", i)
 			}
-			pos := 0
-			baseSize, err := packVarintRead(payload, &pos)
+			baseSize, resultSize, err := readDeltaSizes(payload)
 			if err != nil {
-				return fmt.Errorf("obj %d ref delta base size: %v", i, err)
+				return fmt.Errorf("obj %d ref delta sizes: %v", i, err)
 			}
-			resultSize, err := packVarintRead(payload, &pos)
-			if err != nil {
-				return fmt.Errorf("obj %d ref delta result size: %v", i, err)
-			}
 			if baseSize != len(baseBody) {
 				return fmt.Errorf("obj %d ref delta base size mismatch: got %d want %d", i, baseSize, len(baseBody))
 			}
@@ -502,6 +491,19 @@
 		}
 	}
 	return nil
+}
+
+func readDeltaSizes(delta []byte) (int, int, error) {
+	pos := 0
+	baseSize, err := packVarintRead(delta, &pos)
+	if err != nil {
+		return 0, 0, err
+	}
+	resultSize, err := packVarintRead(delta, &pos)
+	if err != nil {
+		return 0, 0, err
+	}
+	return baseSize, resultSize, nil
 }
 
 func removeLooseObject(repoPath, oid string) error {
--