Fast implementation of Git in pure Go
1package packed
2
3import (
4 "codeberg.org/lindenii/furgit/internal/lru"
5 "codeberg.org/lindenii/furgit/objecttype"
6)
7
8const defaultDeltaCacheMaxBytes = 32 << 20
9
10// deltaBaseKey identifies one base object by pack location.
11type deltaBaseKey struct {
12 packName string
13 offset uint64
14}
15
16// deltaBaseValue stores one cached base object body.
17type deltaBaseValue struct {
18 ty objecttype.Type
19 content []byte
20}
21
22// deltaCache wraps a weighted LRU for resolved delta bases.
23type deltaCache struct {
24 lru *lru.Cache[deltaBaseKey, deltaBaseValue]
25}
26
27// newDeltaCache creates a delta base cache with a byte budget.
28func newDeltaCache(maxBytes int64) *deltaCache {
29 return &deltaCache{
30 lru: lru.New(
31 maxBytes,
32 func(_ deltaBaseKey, value deltaBaseValue) int64 {
33 return int64(len(value.content))
34 },
35 nil,
36 ),
37 }
38}
39
40// get returns a cloned cached base object value.
41func (cache *deltaCache) get(key deltaBaseKey) (objecttype.Type, []byte, bool) {
42 value, ok := cache.lru.Get(key)
43 if !ok {
44 return objecttype.TypeInvalid, nil, false
45 }
46
47 return value.ty, append([]byte(nil), value.content...), true
48}
49
50// add stores a cloned base object value.
51func (cache *deltaCache) add(key deltaBaseKey, ty objecttype.Type, content []byte) {
52 cache.lru.Add(key, deltaBaseValue{
53 ty: ty,
54 content: append([]byte(nil), content...),
55 })
56}
57
58// clear removes all cached entries.
59func (cache *deltaCache) clear() {
60 cache.lru.Clear()
61}