func writeFileAtomic(path string, data []byte, mode os.FileMode, uid, gid int) error { chmodAndChown := func(f *os.File) error { if err := f.Chmod(mode); err != nil { return err } if uid != 0 { if err := f.Chown(uid, gid); err != nil { return err } } return nil } return utils.AtomicWriteFileAndChange(path, data, chmodAndChown) }
func writeFileAtomic(path string, data []byte, mode os.FileMode, uid, gid int) error { chmodAndChown := func(f *os.File) error { // f.Chmod() and f.Chown() are not implemented on Windows // There is currently no good way of doing file permission // management for Windows, directly from Go. The behavior of os.Chmod() // is different from its linux implementation. if runtime.GOOS == "windows" { return nil } if err := f.Chmod(mode); err != nil { return err } if uid != 0 { if err := f.Chown(uid, gid); err != nil { return err } } return nil } return utils.AtomicWriteFileAndChange(path, data, chmodAndChown) }
}{{ summary: "atomic file write and chmod 0644", change: func(filename string, contents []byte) error { return utils.AtomicWriteFile(filename, contents, 0765) }, check: func(c *gc.C, fi os.FileInfo) { c.Assert(fi.Mode(), gc.Equals, 0765) }, }, { summary: "atomic file write and change", change: func(filename string, contents []byte) error { chmodChange := func(f *os.File) error { // FileMod.Chmod() is not implemented on Windows, however, os.Chmod() is return os.Chmod(f.Name(), 0700) } return utils.AtomicWriteFileAndChange(filename, contents, chmodChange) }, check: func(c *gc.C, fi os.FileInfo) { c.Assert(fi.Mode(), gc.Equals, 0700) }, }, { summary: "atomic file write empty contents", change: func(filename string, contents []byte) error { nopChange := func(*os.File) error { return nil } return utils.AtomicWriteFileAndChange(filename, contents, nopChange) }, }, { summary: "atomic file write and failing change func", change: func(filename string, contents []byte) error {