aboutsummaryrefslogtreecommitdiff
path: root/format/packfile/ingest/resolve_all.go
diff options
context:
space:
mode:
Diffstat (limited to 'format/packfile/ingest/resolve_all.go')
-rw-r--r--format/packfile/ingest/resolve_all.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/format/packfile/ingest/resolve_all.go b/format/packfile/ingest/resolve_all.go
new file mode 100644
index 00000000..e0ad2281
--- /dev/null
+++ b/format/packfile/ingest/resolve_all.go
@@ -0,0 +1,71 @@
+package ingest
+
+import (
+ "errors"
+
+ "codeberg.org/lindenii/furgit/internal/progress"
+)
+
+// resolveAll resolves all delta records and finalizes ObjectID/RealType for every record.
+func resolveAll(state *ingestState) error {
+ state.unresolvedRefDeltas = state.unresolvedRefDeltas[:0]
+
+ var pending uint32
+
+ for idx := range state.records {
+ if !state.records[idx].resolved {
+ pending++
+ }
+ }
+
+ if pending == 0 {
+ return nil
+ }
+
+ var done uint32
+
+ meter := progress.New(progress.Options{
+ Writer: state.opts.Progress,
+ Flush: state.opts.ProgressFlush,
+ Title: "resolving deltas",
+ Total: uint64(pending),
+ })
+
+ for idx := range state.records {
+ if state.records[idx].resolved {
+ continue
+ }
+
+ done++
+ meter.Set(uint64(done), 0)
+
+ visiting := make(map[int]struct{})
+
+ ty, content, err := resolveRecord(state, idx, visiting)
+ if err != nil {
+ if errors.Is(err, errExternalThinBase) {
+ state.unresolvedRefDeltas = append(state.unresolvedRefDeltas, idx)
+
+ continue
+ }
+
+ return err
+ }
+
+ id, err := hashCanonicalObject(state.algo, ty, content)
+ if err != nil {
+ return err
+ }
+
+ record := &state.records[idx]
+ record.realType = ty
+ record.objectID = id
+ record.resolved = true
+ state.objectToRecord[id] = idx
+ state.baseCache.add(idx, ty, content)
+ }
+
+ meter.Stop("done")
+
+ return nil
+}