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
}