diff --git a/lib/move/index.js b/lib/move/index.js index 195ab9f7..cff5e91b 100644 --- a/lib/move/index.js +++ b/lib/move/index.js @@ -12,6 +12,8 @@ const path = require('path') const remove = require('../remove').remove const mkdirp = require('../mkdirs').mkdirs +const utimes = require('../util/utimes') + function move (source, dest, options, callback) { if (typeof options === 'function') { callback = options @@ -21,6 +23,10 @@ function move (source, dest, options, callback) { const shouldMkdirp = ('mkdirp' in options) ? options.mkdirp : true const overwrite = options.overwrite || options.clobber || false + let optionsCopy = { + preserveTimestamps: ('preserveTimestamps' in options) ? options.preserveTimestamps : true + } + if (shouldMkdirp) { mkdirs() } else { @@ -61,13 +67,13 @@ function move (source, dest, options, callback) { } if (err.code !== 'EXDEV') return callback(err) - moveAcrossDevice(source, dest, overwrite, callback) + moveAcrossDevice(source, dest, overwrite, optionsCopy, callback) }) } else { fs.link(source, dest, err => { if (err) { if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM' || err.code === 'ENOTSUP') { - moveAcrossDevice(source, dest, overwrite, callback) + moveAcrossDevice(source, dest, overwrite, optionsCopy, callback) return } callback(err) @@ -79,22 +85,26 @@ function move (source, dest, options, callback) { } } -function moveAcrossDevice (source, dest, overwrite, callback) { +function moveAcrossDevice (source, dest, overwrite, optionsCopy, callback) { fs.stat(source, (err, stat) => { if (err) { callback(err) return } + let optionsTemp = Object.assign({}, optionsCopy, { + stat: stat + }) + if (stat.isDirectory()) { - moveDirAcrossDevice(source, dest, overwrite, callback) + moveDirAcrossDevice(source, dest, overwrite, optionsTemp, callback) } else { - moveFileAcrossDevice(source, dest, overwrite, callback) + moveFileAcrossDevice(source, dest, overwrite, optionsTemp, callback) } }) } -function moveFileAcrossDevice (source, dest, overwrite, callback) { +function moveFileAcrossDevice (source, dest, overwrite, optionsTemp, callback) { const flags = overwrite ? 'w' : 'wx' const ins = fs.createReadStream(source) const outs = fs.createWriteStream(dest, { flags }) @@ -112,7 +122,14 @@ function moveFileAcrossDevice (source, dest, overwrite, callback) { if (err.code === 'EISDIR' || err.code === 'EPERM') { moveDirAcrossDevice(source, dest, overwrite, callback) } else { - callback(err) + // callback(err) + if (optionsTemp.preserveTimestamps) { + utimes.utimesMillis(dest, optionsTemp.stat.atime, optionsTemp.stat.mtime, function (err) { + return callback(err) + }) + } else { + callback(err) + } } }) }) @@ -132,8 +149,9 @@ function moveFileAcrossDevice (source, dest, overwrite, callback) { } } -function moveDirAcrossDevice (source, dest, overwrite, callback) { +function moveDirAcrossDevice (source, dest, overwrite, optionsTemp, callback) { const options = { + preserveTimestamps: optionsTemp.preserveTimestamps, overwrite: false }