diff options
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 +} |
