func compareAndWriteFile()

in lib/store/base/file_entry.go [582:625]


func compareAndWriteFile(filePath string, b []byte) (bool, error) {
	// Check existence.
	fs, err := os.Stat(filePath)
	if err != nil && !os.IsNotExist(err) {
		return false, err
	}

	if os.IsNotExist(err) {
		if err := os.MkdirAll(filepath.Dir(filePath), 0775); err != nil {
			return false, err
		}

		if err := ioutil.WriteFile(filePath, b, 0775); err != nil {
			return false, err
		}
		return true, nil
	}

	f, err := os.OpenFile(filePath, os.O_RDWR, 0775)
	if err != nil {
		return false, err
	}
	defer f.Close()

	// Compare with existing data, overwrite if different.
	buf := make([]byte, int(fs.Size()))
	if _, err := f.Read(buf); err != nil {
		return false, err
	}
	if bytes.Compare(buf, b) == 0 {
		return false, nil
	}

	if len(buf) != len(b) {
		if err := f.Truncate(int64(len(b))); err != nil {
			return false, err
		}
	}

	if _, err := f.WriteAt(b, 0); err != nil {
		return false, err
	}
	return true, nil
}