diff options
Diffstat (limited to 'deps/npm/node_modules/write-file-atomic/index.js')
-rw-r--r-- | deps/npm/node_modules/write-file-atomic/index.js | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/deps/npm/node_modules/write-file-atomic/index.js b/deps/npm/node_modules/write-file-atomic/index.js index 7939828e53..c677ee9622 100644 --- a/deps/npm/node_modules/write-file-atomic/index.js +++ b/deps/npm/node_modules/write-file-atomic/index.js @@ -6,7 +6,6 @@ module.exports._getTmpname = getTmpname // for testing var fs = require('graceful-fs') var chain = require('slide').chain var MurmurHash3 = require('imurmurhash') -var extend = Object.assign || require('util')._extend var invocations = 0 function getTmpname (filename) { @@ -38,7 +37,7 @@ function _writeFile (filename, data, options, callback) { return fs.stat(filename, function (err, stats) { if (err || !stats) return thenWriteFile() - options = extend({}, options) + options = Object.assign({}, options) if (!options.mode) { options.mode = stats.mode } @@ -51,15 +50,41 @@ function _writeFile (filename, data, options, callback) { function thenWriteFile () { chain([ - [fs, fs.writeFile, tmpfile, data, options.encoding || 'utf8'], - options.mode && [fs, fs.chmod, tmpfile, options.mode], + [writeFileAsync, tmpfile, data, options.mode, options.encoding || 'utf8'], options.chown && [fs, fs.chown, tmpfile, options.chown.uid, options.chown.gid], + options.mode && [fs, fs.chmod, tmpfile, options.mode], [fs, fs.rename, tmpfile, filename] ], function (err) { err ? fs.unlink(tmpfile, function () { callback(err) }) : callback() }) } + + // doing this instead of `fs.writeFile` in order to get the ability to + // call `fsync`. + function writeFileAsync (file, data, mode, encoding, cb) { + fs.open(file, 'w', options.mode, function (err, fd) { + if (err) return cb(err) + if (Buffer.isBuffer(data)) { + return fs.write(fd, data, 0, data.length, 0, syncAndClose) + } else if (data != null) { + return fs.write(fd, String(data), 0, String(encoding), syncAndClose) + } else { + return syncAndClose() + } + function syncAndClose (err) { + if (err) return cb(err) + if (options.fsync !== false) { + fs.fsync(fd, function (err) { + if (err) return cb(err) + fs.close(fd, cb) + }) + } else { + fs.close(fd, cb) + } + } + }) + } } function writeFileSync (filename, data, options) { @@ -77,7 +102,7 @@ function writeFileSync (filename, data, options) { // Default behavior is to copy it from original file try { var stats = fs.statSync(filename) - options = extend({}, options) + options = Object.assign({}, options) if (!options.mode) { options.mode = stats.mode } @@ -89,7 +114,16 @@ function writeFileSync (filename, data, options) { } } - fs.writeFileSync(tmpfile, data, options.encoding || 'utf8') + var fd = fs.openSync(tmpfile, 'w', options.mode) + if (Buffer.isBuffer(data)) { + fs.writeSync(fd, data, 0, data.length, 0) + } else if (data != null) { + fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) + } + if (options.fsync !== false) { + fs.fsyncSync(fd) + } + fs.closeSync(fd) if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) if (options.mode) fs.chmodSync(tmpfile, options.mode) fs.renameSync(tmpfile, filename) |