package solver import ( "sync" digest "github.com/opencontainers/go-digest" ) // NewCacheKey creates a new cache key for a specific output index func NewCacheKey(dgst digest.Digest, output Index) *CacheKey { return &CacheKey{ ID: rootKey(dgst, output).String(), digest: dgst, output: output, ids: map[*cacheManager]string{}, } } // CacheKeyWithSelector combines a cache key with an optional selector digest. // Used to limit the matches for dependency cache key. type CacheKeyWithSelector struct { Selector digest.Digest CacheKey ExportableCacheKey } type CacheKey struct { mu sync.RWMutex ID string deps [][]CacheKeyWithSelector // only [][]*inMemoryCacheKey digest digest.Digest output Index ids map[*cacheManager]string indexIDs []string } func (ck *CacheKey) Deps() [][]CacheKeyWithSelector { ck.mu.RLock() defer ck.mu.RUnlock() deps := make([][]CacheKeyWithSelector, len(ck.deps)) for i := range ck.deps { deps[i] = append([]CacheKeyWithSelector(nil), ck.deps[i]...) } return deps } func (ck *CacheKey) Digest() digest.Digest { return ck.digest } func (ck *CacheKey) Output() Index { return ck.output } func (ck *CacheKey) clone() *CacheKey { nk := &CacheKey{ ID: ck.ID, digest: ck.digest, output: ck.output, ids: map[*cacheManager]string{}, } for cm, id := range ck.ids { nk.ids[cm] = id } return nk }