1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
}
|