in file.go [184:208]
func safeWriteContent(ctx context.Context, scope Scope, path string, content FileContent, md5Sum string) error {
tmpFile, err := os.CreateTemp(filepath.Dir(path), filepath.Base(path))
if err != nil {
return err
}
defer os.Remove(tmpFile.Name())
checksum := md5.New()
w := io.MultiWriter(tmpFile, checksum)
err = content(ctx, scope, w)
tmpFile.Close()
if err != nil {
return err
}
if md5Sum != "" && md5Sum != string(checksum.Sum(nil)) {
return errors.New("md5 checksum of content differs")
}
err = os.Remove(path)
if err != nil && !errors.Is(err, fs.ErrNotExist) {
return fmt.Errorf("cannot replace file %s", path)
}
return os.Rename(tmpFile.Name(), path)
}