aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-01-29 20:42:18 +0100
committerGravatar Runxi Yu2026-01-29 20:42:18 +0100
commit45da63f4d0fd94e5a8b11fc6aa8b626338dcabf8 (patch)
tree8c82b37db034ef4f897dd30d27987d72a2c87b50
parentTODO: Add revamp error handling (diff)
signatureNo signature
packed: Cleanup
-rw-r--r--packed_read_idx.go26
-rw-r--r--packed_write_test.go34
2 files changed, 23 insertions, 37 deletions
diff --git a/packed_read_idx.go b/packed_read_idx.go
index 0dbb9bcf..515ccdc0 100644
--- a/packed_read_idx.go
+++ b/packed_read_idx.go
@@ -2,6 +2,7 @@ package furgit
import (
"bytes"
+ "encoding/binary"
"errors"
"fmt"
"os"
@@ -146,10 +147,10 @@ func (pi *packIndex) parse(buf []byte) error {
if len(buf) < 8+256*4 {
return ErrInvalidObject
}
- if readBE32(buf[0:4]) != idxMagic {
+ if binary.BigEndian.Uint32(buf[0:4]) != idxMagic {
return ErrInvalidObject
}
- if readBE32(buf[4:8]) != idxVersion2 {
+ if binary.BigEndian.Uint32(buf[4:8]) != idxVersion2 {
return ErrInvalidObject
}
@@ -160,7 +161,7 @@ func (pi *packIndex) parse(buf []byte) error {
return ErrInvalidObject
}
pi.fanout = buf[fanoutStart:fanoutEnd]
- nobj := int(readBE32(pi.fanout[len(pi.fanout)-4:]))
+ nobj := int(binary.BigEndian.Uint32(pi.fanout[len(pi.fanout)-4:]))
namesStart := fanoutEnd
namesEnd := namesStart + nobj*pi.repo.hashAlgo.Size()
@@ -199,19 +200,6 @@ func (pi *packIndex) parse(buf []byte) error {
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
@@ -221,12 +209,12 @@ func (pi *packIndex) fanoutEntry(i int) uint32 {
return 0
}
start := i * 4
- return readBE32(pi.fanout[start : start+4])
+ return binary.BigEndian.Uint32(pi.fanout[start : start+4])
}
func (pi *packIndex) offset(idx int) (uint64, error) {
start := idx * 4
- word := readBE32(pi.offset32[start : start+4])
+ word := binary.BigEndian.Uint32(pi.offset32[start : start+4])
if word&0x80000000 == 0 {
return uint64(word), nil
}
@@ -236,7 +224,7 @@ func (pi *packIndex) offset(idx int) (uint64, error) {
return 0, errors.New("furgit: pack: corrupt 64-bit offset table")
}
base := pos * 8
- return readBE64(pi.offset64[base : base+8]), nil
+ return binary.BigEndian.Uint64(pi.offset64[base : base+8]), nil
}
func (pi *packIndex) lookup(id Hash) (packlocation, error) {
diff --git a/packed_write_test.go b/packed_write_test.go
index 63fd9266..ccd81844 100644
--- a/packed_write_test.go
+++ b/packed_write_test.go
@@ -3,6 +3,7 @@ package furgit
import (
"bytes"
"crypto/rand"
+ "encoding/binary"
"fmt"
"os"
"os/exec"
@@ -365,7 +366,7 @@ func checkPackStream(path string, algo hashAlgorithm, objectCount int) error {
if len(data) < 12 {
return ErrInvalidObject
}
- if readBE32(data[0:4]) != packMagic || readBE32(data[4:8]) != packVersion2 {
+ if binary.BigEndian.Uint32(data[0:4]) != packMagic || binary.BigEndian.Uint32(data[4:8]) != packVersion2 {
return ErrInvalidObject
}
pos := 12
@@ -433,9 +434,14 @@ func checkPackStream(path string, algo hashAlgorithm, objectCount int) error {
if baseBody == nil {
return fmt.Errorf("obj %d missing base body", i)
}
- baseSize, resultSize, err := readDeltaSizes(payload)
+ pos := 0
+ baseSize, err := packVarintRead(payload, &pos)
if err != nil {
- return fmt.Errorf("obj %d delta sizes: %v", i, err)
+ return fmt.Errorf("obj %d delta base size: %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))
@@ -454,9 +460,14 @@ func checkPackStream(path string, algo hashAlgorithm, objectCount int) error {
if baseBody == nil {
return fmt.Errorf("obj %d missing ref base body", i)
}
- baseSize, resultSize, err := readDeltaSizes(payload)
+ pos := 0
+ baseSize, err := packVarintRead(payload, &pos)
if err != nil {
- return fmt.Errorf("obj %d ref delta sizes: %v", i, err)
+ return fmt.Errorf("obj %d ref delta base size: %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))
@@ -493,19 +504,6 @@ func checkPackStream(path string, algo hashAlgorithm, objectCount int) error {
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 {
if len(oid) < 2 {
return ErrInvalidObject