2 var fs = require('graceful-fs')
3 var chain = require('slide').chain
4 var MurmurHash3 = require('imurmurhash')
6 function murmurhex () {
7 var hash = new MurmurHash3()
8 for (var ii = 0; ii < arguments.length; ++ii) hash.hash('' + arguments[ii])
12 var getTmpname = function (filename) {
13 return filename + '.' + murmurhex(__filename, process.pid, ++invocations)
16 module.exports = function writeFile (filename, data, options, callback) {
17 if (options instanceof Function) {
21 if (!options) options = {}
22 var tmpfile = getTmpname(filename)
24 [fs, fs.writeFile, tmpfile, data, options],
25 options.chown && [fs, fs.chown, tmpfile, options.chown.uid, options.chown.gid],
26 [fs, fs.rename, tmpfile, filename]
28 err ? fs.unlink(tmpfile, function () { callback(err) })
33 module.exports.sync = function writeFileSync (filename, data, options) {
34 if (!options) options = {}
35 var tmpfile = getTmpname(filename)
37 fs.writeFileSync(tmpfile, data, options)
38 if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid)
39 fs.renameSync(tmpfile, filename)
41 try { fs.unlinkSync(tmpfile) } catch (e) {}