aboutsummaryrefslogtreecommitdiff
path: root/format/packfile/ingest/record_resolve.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-30 14:28:13 +0000
committerGravatar Runxi Yu2026-03-30 14:28:13 +0000
commita4eeb727468a178a4de0dfc718828f26740484ac (patch)
tree4318d38d49facc80e2e2186f5919fa656be3b31f /format/packfile/ingest/record_resolve.go
parentobject/store/packed: Make store own root, algo, opts (diff)
signatureNo signature
object,store/packed{,/internal/ingest}: Move from format/packfile/ingest
Diffstat (limited to 'format/packfile/ingest/record_resolve.go')
-rw-r--r--format/packfile/ingest/record_resolve.go116
1 files changed, 0 insertions, 116 deletions
diff --git a/format/packfile/ingest/record_resolve.go b/format/packfile/ingest/record_resolve.go
deleted file mode 100644
index 7a9471dc..00000000
--- a/format/packfile/ingest/record_resolve.go
+++ /dev/null
@@ -1,116 +0,0 @@
-package ingest
-
-import (
- "fmt"
-
- objecttype "codeberg.org/lindenii/furgit/object/type"
-)
-
-// resolveRecord resolves one record and returns canonical type/content.
-func resolveRecord(state *ingestState, idx int, visiting map[int]struct{}) (objecttype.Type, []byte, error) {
- if idx < 0 || idx >= len(state.records) {
- return objecttype.TypeInvalid, nil, fmt.Errorf("packfile/ingest: record index out of bounds")
- }
-
- if _, ok := visiting[idx]; ok {
- return objecttype.TypeInvalid, nil, &DeltaCycleError{Offset: state.records[idx].offset}
- }
-
- visiting[idx] = struct{}{}
- defer delete(visiting, idx)
-
- record := &state.records[idx]
- if ty, content, ok := state.baseCache.get(idx); ok {
- return ty, content, nil
- }
-
- if record.packedType.IsBaseObject() {
- ty, content, err := readBaseRecordContent(state, idx)
- if err != nil {
- return objecttype.TypeInvalid, nil, err
- }
-
- if record.resolved {
- state.baseCache.add(idx, record.realType, content)
-
- return record.realType, content, nil
- }
-
- id, err := hashCanonicalObject(state.algo, ty, content)
- if err != nil {
- return objecttype.TypeInvalid, nil, err
- }
-
- record.objectID = id
- record.realType = ty
- record.resolved = true
- state.objectToRecord[id] = idx
- state.baseCache.add(idx, ty, content)
-
- return ty, content, nil
- }
-
- var (
- baseType objecttype.Type
- baseContent []byte
- err error
- )
- switch record.packedType {
- case objecttype.TypeOfsDelta:
- baseIdx, ok := state.offsetToRecord[record.baseOffset]
- if !ok {
- return objecttype.TypeInvalid, nil, &MalformedPackEntryError{
- Offset: record.offset,
- Reason: "missing ofs-delta base entry",
- }
- }
-
- baseType, baseContent, err = resolveRecord(state, baseIdx, visiting)
- if err != nil {
- return objecttype.TypeInvalid, nil, err
- }
- case objecttype.TypeRefDelta:
- baseIdx, ok := state.objectToRecord[record.baseObject]
- if ok {
- baseType, baseContent, err = resolveRecord(state, baseIdx, visiting)
- if err != nil {
- return objecttype.TypeInvalid, nil, err
- }
- } else {
- return objecttype.TypeInvalid, nil, errExternalThinBase
- }
- case objecttype.TypeInvalid,
- objecttype.TypeCommit,
- objecttype.TypeTree,
- objecttype.TypeBlob,
- objecttype.TypeTag,
- objecttype.TypeFuture:
- return objecttype.TypeInvalid, nil, &MalformedPackEntryError{
- Offset: record.offset,
- Reason: "unsupported delta type",
- }
- default:
- return objecttype.TypeInvalid, nil, &MalformedPackEntryError{
- Offset: record.offset,
- Reason: "unsupported delta type",
- }
- }
-
- ty, content, err := applyDeltaRecord(state, idx, baseType, baseContent)
- if err != nil {
- return objecttype.TypeInvalid, nil, err
- }
-
- id, err := hashCanonicalObject(state.algo, ty, content)
- if err != nil {
- return objecttype.TypeInvalid, nil, err
- }
-
- record.objectID = id
- record.realType = ty
- record.resolved = true
- state.objectToRecord[id] = idx
- state.baseCache.add(idx, ty, content)
-
- return ty, content, nil
-}