aboutsummaryrefslogtreecommitdiff
path: root/format/pack/ingest/rev_write.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-05 20:55:17 +0800
committerGravatar Runxi Yu2026-03-05 20:55:17 +0800
commit915fca6a9c2923a3bcf7a5a257e5832fab8cd432 (patch)
tree1726c92257263033da5cadb4a570c97b68332ee7 /format/pack/ingest/rev_write.go
parentlint: Exclude compress/{flate,internal} (diff)
signatureNo signature
*: Fix lint wsl_v5
Diffstat (limited to 'format/pack/ingest/rev_write.go')
-rw-r--r--format/pack/ingest/rev_write.go11
1 files changed, 11 insertions, 0 deletions
diff --git a/format/pack/ingest/rev_write.go b/format/pack/ingest/rev_write.go
index cf95c782..5e9dbcbd 100644
--- a/format/pack/ingest/rev_write.go
+++ b/format/pack/ingest/rev_write.go
@@ -19,10 +19,12 @@ func writeRev(state *ingestState) error {
}
idxOrder := buildIdxOrder(state)
+
recordToIdxPos := make([]int, len(state.records))
for pos, recordIdx := range idxOrder {
recordToIdxPos[recordIdx] = pos
}
+
packOrder := buildPackOrder(state)
hashImpl, err := state.algo.New()
@@ -32,20 +34,26 @@ func writeRev(state *ingestState) error {
var scratch [8]byte
binary.BigEndian.PutUint32(scratch[:4], revMagic)
+
if err := writeAndHash(state.revFile, hashImpl, scratch[:4]); err != nil {
return err
}
+
binary.BigEndian.PutUint32(scratch[:4], revVersion)
+
if err := writeAndHash(state.revFile, hashImpl, scratch[:4]); err != nil {
return err
}
+
binary.BigEndian.PutUint32(scratch[:4], hashID(state.algo))
+
if err := writeAndHash(state.revFile, hashImpl, scratch[:4]); err != nil {
return err
}
for _, recordIdx := range packOrder {
binary.BigEndian.PutUint32(scratch[:4], uint32(recordToIdxPos[recordIdx]))
+
if err := writeAndHash(state.revFile, hashImpl, scratch[:4]); err != nil {
return err
}
@@ -54,6 +62,7 @@ func writeRev(state *ingestState) error {
if err := writeAndHash(state.revFile, hashImpl, state.packHash.Bytes()); err != nil {
return err
}
+
revHash := hashImpl.Sum(nil)
if _, err := state.revFile.Write(revHash); err != nil {
return err
@@ -68,8 +77,10 @@ func buildPackOrder(state *ingestState) []int {
for idx := range state.records {
out = append(out, idx)
}
+
slices.SortFunc(out, func(a, b int) int {
offA := state.records[a].offset
+
offB := state.records[b].offset
switch {
case offA < offB: