summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/write-file-atomic/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/write-file-atomic/index.js')
-rw-r--r--deps/npm/node_modules/write-file-atomic/index.js46
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)