diff options
| author | 2026-02-21 05:35:12 +0800 | |
|---|---|---|
| committer | 2026-02-21 11:15:18 +0800 | |
| commit | ae879b8cf5a87199802a33d6b15c76afafa8002b (patch) | |
| tree | a93e9486a9610b78823e157c68b75e0724366217 /objectstore/packed/delta_base.go | |
| parent | cache/lru: Add basic LRU (diff) | |
| signature | No signature | |
objectstore/packed: Add initial pack reading support
Diffstat (limited to 'objectstore/packed/delta_base.go')
| -rw-r--r-- | objectstore/packed/delta_base.go | 39 |
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 +} |
