aboutsummaryrefslogtreecommitdiff
path: root/objectstore/packed/delta_base.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-21 05:35:12 +0800
committerGravatar Runxi Yu2026-02-21 11:15:18 +0800
commitae879b8cf5a87199802a33d6b15c76afafa8002b (patch)
treea93e9486a9610b78823e157c68b75e0724366217 /objectstore/packed/delta_base.go
parentcache/lru: Add basic LRU (diff)
signatureNo signature
objectstore/packed: Add initial pack reading support
Diffstat (limited to 'objectstore/packed/delta_base.go')
-rw-r--r--objectstore/packed/delta_base.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/objectstore/packed/delta_base.go b/objectstore/packed/delta_base.go
new file mode 100644
index 00000000..fd9b96d5
--- /dev/null
+++ b/objectstore/packed/delta_base.go
@@ -0,0 +1,39 @@
+package packed
+
+import (
+ "fmt"
+
+ "codeberg.org/lindenii/furgit/objecttype"
+)
+
+// deltaResolveBase materializes the base object body for one delta plan.
+func (store *Store) deltaResolveBase(plan deltaPlan) (objecttype.Type, []byte, error) {
+ cacheKey := deltaBaseKey{
+ packName: plan.baseLoc.packName,
+ offset: plan.baseLoc.offset,
+ }
+
+ store.cacheMu.RLock()
+ if ty, content, ok := store.deltaCache.get(cacheKey); ok {
+ store.cacheMu.RUnlock()
+ return ty, content, nil
+ }
+ store.cacheMu.RUnlock()
+
+ pack, meta, err := store.entryMetaAt(plan.baseLoc)
+ if err != nil {
+ return objecttype.TypeInvalid, nil, err
+ }
+ if !isBaseObjectType(meta.ty) {
+ return objecttype.TypeInvalid, nil, fmt.Errorf("objectstore/packed: delta plan base is not a base object")
+ }
+ base, err := inflateAt(pack, meta.dataOffset, meta.size)
+ if err != nil {
+ return objecttype.TypeInvalid, nil, err
+ }
+
+ store.cacheMu.Lock()
+ store.deltaCache.add(cacheKey, meta.ty, base)
+ store.cacheMu.Unlock()
+ return meta.ty, base, nil
+}