package watch import ( "path/filepath" "regexp" "sync" ) type PackageHashes struct { PackageHashes map[string]*PackageHash usedPaths map[string]bool watchRegExp *regexp.Regexp lock *sync.Mutex } func NewPackageHashes(watchRegExp *regexp.Regexp) *PackageHashes { return &PackageHashes{ PackageHashes: map[string]*PackageHash{}, usedPaths: nil, watchRegExp: watchRegExp, lock: &sync.Mutex{}, } } func (p *PackageHashes) CheckForChanges() []string { p.lock.Lock() defer p.lock.Unlock() modified := []string{} for _, packageHash := range p.PackageHashes { if packageHash.CheckForChanges() { modified = append(modified, packageHash.path) } } return modified } func (p *PackageHashes) Add(path string) *PackageHash { p.lock.Lock() defer p.lock.Unlock() path, _ = filepath.Abs(path) _, ok := p.PackageHashes[path] if !ok { p.PackageHashes[path] = NewPackageHash(path, p.watchRegExp) } if p.usedPaths != nil { p.usedPaths[path] = true } return p.PackageHashes[path] } func (p *PackageHashes) Get(path string) *PackageHash { p.lock.Lock() defer p.lock.Unlock() path, _ = filepath.Abs(path) if p.usedPaths != nil { p.usedPaths[path] = true } return p.PackageHashes[path] } func (p *PackageHashes) StartTrackingUsage() { p.lock.Lock() defer p.lock.Unlock() p.usedPaths = map[string]bool{} } func (p *PackageHashes) StopTrackingUsageAndPrune() { p.lock.Lock() defer p.lock.Unlock() for path := range p.PackageHashes { if !p.usedPaths[path] { delete(p.PackageHashes, path) } } p.usedPaths = nil }