Fast implementation of Git in pure Go
at master 61 lines 1.4 kB view raw
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}