aboutsummaryrefslogtreecommitdiff
path: root/format/pack/ingest/scan.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-08 12:03:26 +0800
committerGravatar Runxi Yu2026-03-08 12:03:26 +0800
commitae5c818674e2c9ca950ca7a9bf93f1283e7411b7 (patch)
tree25d1702260993a8066690c93b3da81adea6d4258 /format/pack/ingest/scan.go
parentreceivepack: Trivial caps (diff)
signatureNo signature
receivepack, format/pack/ingest: Two-stage ingestion
Diffstat (limited to 'format/pack/ingest/scan.go')
-rw-r--r--format/pack/ingest/scan.go29
1 files changed, 28 insertions, 1 deletions
diff --git a/format/pack/ingest/scan.go b/format/pack/ingest/scan.go
index 2fa88b51..b5d683a8 100644
--- a/format/pack/ingest/scan.go
+++ b/format/pack/ingest/scan.go
@@ -23,7 +23,7 @@ func streamPackAndScan(state *ingestState) error {
utils.WriteProgressf(state.opts.Progress, "validating pack header...\r")
- err = readAndValidatePackHeader(state)
+ err = seedStreamWithPackHeader(state)
if err != nil {
return err
}
@@ -75,3 +75,30 @@ func streamPackAndScan(state *ingestState) error {
return state.stream.flush()
}
+
+// seedStreamWithPackHeader writes the already-validated PACK header to output,
+// seeds the running pack hash, and advances stream offset accounting.
+func seedStreamWithPackHeader(state *ingestState) error {
+ written := 0
+ for written < len(state.packHeaderRaw) {
+ n, err := state.packFile.Write(state.packHeaderRaw[written:])
+ if err != nil {
+ return &DestinationWriteError{Op: fmt.Sprintf("write pack header: %v", err)}
+ }
+
+ if n == 0 {
+ return &DestinationWriteError{Op: "write pack header: short write"}
+ }
+
+ written += n
+ }
+
+ _, err := state.stream.hash.Write(state.packHeaderRaw[:])
+ if err != nil {
+ return err
+ }
+
+ state.stream.consumed = packHeaderSize
+
+ return nil
+}