Skip to content

Commit

Permalink
Allow preserveTimestamps with move.
Browse files Browse the repository at this point in the history
  • Loading branch information
bluelovers authored and jdalton committed Mar 7, 2017
1 parent 9bef553 commit 6c665f6
Showing 1 changed file with 26 additions and 8 deletions.
34 changes: 26 additions & 8 deletions lib/move/index.js
Expand Up @@ -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
Expand All @@ -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 {
Expand Down Expand Up @@ -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)
Expand All @@ -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 })
Expand All @@ -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)
}
}
})
})
Expand All @@ -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
}

Expand Down

0 comments on commit 6c665f6

Please sign in to comment.