in cmd/apmtool/cache.go [64:97]
func updateCache(filename string, update func([]byte) ([]byte, error)) error {
if strings.HasPrefix(filename, ".") {
return fmt.Errorf("invalid filename %q, may not start with '.'", filename)
}
cacheFlock := newCacheFlock()
if err := cacheFlock.Lock(); err != nil {
return fmt.Errorf("error acquiring lock on cache directory: %w", err)
}
defer cacheFlock.Unlock()
cacheFilePath := filepath.Join(cacheDir, filename)
cacheFilePathTemp := filepath.Join(cacheDir, ".temp."+filename)
data, err := os.ReadFile(cacheFilePath)
if err != nil {
if !errors.Is(err, os.ErrNotExist) {
return fmt.Errorf("error reading cache file: %w", err)
}
data = nil
}
data, err = update(data)
if err != nil {
return fmt.Errorf("error updating cache file %q: %w", filename, err)
}
// Write temporary file and rename, to prevent partial writes.
if err := os.WriteFile(cacheFilePathTemp, data, 0600); err != nil {
return fmt.Errorf("error writing temporary cache file %q: %w", filename, err)
}
if err := os.Rename(cacheFilePathTemp, cacheFilePath); err != nil {
return fmt.Errorf("error renaming temporary cache file %q: %w", filename, err)
}
return nil
}