diff options
| author | 2026-03-08 12:03:26 +0800 | |
|---|---|---|
| committer | 2026-03-08 12:03:26 +0800 | |
| commit | ae5c818674e2c9ca950ca7a9bf93f1283e7411b7 (patch) | |
| tree | 25d1702260993a8066690c93b3da81adea6d4258 /format/pack/ingest/scan.go | |
| parent | receivepack: Trivial caps (diff) | |
| signature | No signature | |
receivepack, format/pack/ingest: Two-stage ingestion
Diffstat (limited to 'format/pack/ingest/scan.go')
| -rw-r--r-- | format/pack/ingest/scan.go | 29 |
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 +} |
