func updateCache()

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
}