aboutsummaryrefslogtreecommitdiff
path: root/format/packfile/ingest/state.go
diff options
context:
space:
mode:
Diffstat (limited to 'format/packfile/ingest/state.go')
-rw-r--r--format/packfile/ingest/state.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/format/packfile/ingest/state.go b/format/packfile/ingest/state.go
new file mode 100644
index 00000000..797323b2
--- /dev/null
+++ b/format/packfile/ingest/state.go
@@ -0,0 +1,70 @@
+package ingest
+
+import (
+ "io"
+ "os"
+
+ objectid "codeberg.org/lindenii/furgit/object/id"
+)
+
+const (
+ defaultDeltaBaseCacheMaxBytes = 32 << 20
+)
+
+// ingestState holds mutable state for one Ingest call.
+type ingestState struct {
+ src io.Reader
+ destination *os.Root
+ algo objectid.Algorithm
+ opts Options
+
+ packHeaderRaw [packHeaderSize]byte
+
+ packFile *os.File
+ packTmpName string
+ idxFile *os.File
+ idxTmpName string
+ revFile *os.File
+ revTmpName string
+
+ stream *streamScanner
+
+ records []objectRecord
+ ofsDeltas []ofsDeltaRef
+ refDeltas []refDeltaRef
+ unresolvedRefDeltas []int
+ offsetToRecord map[uint64]int
+ objectToRecord map[objectid.ObjectID]int
+
+ baseCache *deltaBaseCache
+ packHash objectid.ObjectID
+
+ objectCountHeader uint32
+ thinFixed bool
+}
+
+// newIngestState constructs one call-local ingest state.
+func newIngestState(
+ src io.Reader,
+ destination *os.Root,
+ algo objectid.Algorithm,
+ opts Options,
+ header HeaderInfo,
+ headerRaw [packHeaderSize]byte,
+) (*ingestState, error) {
+ if algo.Size() == 0 {
+ return nil, objectid.ErrInvalidAlgorithm
+ }
+
+ return &ingestState{
+ src: src,
+ destination: destination,
+ algo: algo,
+ opts: opts,
+ packHeaderRaw: headerRaw,
+ objectCountHeader: header.ObjectCount,
+ offsetToRecord: make(map[uint64]int),
+ objectToRecord: make(map[objectid.ObjectID]int),
+ baseCache: newDeltaBaseCache(defaultDeltaBaseCacheMaxBytes),
+ }, nil
+}