diff options
Diffstat (limited to 'node_modules/fs-extra/lib/move/index.js')
-rw-r--r-- | node_modules/fs-extra/lib/move/index.js | 82 |
1 files changed, 45 insertions, 37 deletions
diff --git a/node_modules/fs-extra/lib/move/index.js b/node_modules/fs-extra/lib/move/index.js index e5eb2c101..eeeb30fe3 100644 --- a/node_modules/fs-extra/lib/move/index.js +++ b/node_modules/fs-extra/lib/move/index.js @@ -13,40 +13,35 @@ const path = require('path') const remove = require('../remove').remove const mkdirp = require('../mkdirs').mkdirs -function move (source, dest, options, callback) { +function move (src, dest, options, callback) { if (typeof options === 'function') { callback = options options = {} } - const shouldMkdirp = ('mkdirp' in options) ? options.mkdirp : true const overwrite = options.overwrite || options.clobber || false - if (shouldMkdirp) { - mkdirs() - } else { - doRename() - } - - function mkdirs () { + isSrcSubdir(src, dest, (err, itIs) => { + if (err) return callback(err) + if (itIs) return callback(new Error(`Cannot move '${src}' to a subdirectory of itself, '${dest}'.`)) mkdirp(path.dirname(dest), err => { if (err) return callback(err) doRename() }) - } + }) function doRename () { - if (path.resolve(source) === path.resolve(dest)) { - fs.access(source, callback) + if (path.resolve(src) === path.resolve(dest)) { + fs.access(src, callback) } else if (overwrite) { - fs.rename(source, dest, err => { + fs.rename(src, dest, err => { if (!err) return callback() if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST') { remove(dest, err => { if (err) return callback(err) options.overwrite = false // just overwriteed it, no need to do it again - move(source, dest, options, callback) + move(src, dest, options, callback) }) return } @@ -57,49 +52,44 @@ function move (source, dest, options, callback) { remove(dest, err => { if (err) return callback(err) options.overwrite = false - move(source, dest, options, callback) + move(src, dest, options, callback) }) }, 200) return } if (err.code !== 'EXDEV') return callback(err) - moveAcrossDevice(source, dest, overwrite, callback) + moveAcrossDevice(src, dest, overwrite, callback) }) } else { - fs.link(source, dest, err => { + fs.link(src, dest, err => { if (err) { if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM' || err.code === 'ENOTSUP') { - moveAcrossDevice(source, dest, overwrite, callback) - return + return moveAcrossDevice(src, dest, overwrite, callback) } - callback(err) - return + return callback(err) } - fs.unlink(source, callback) + return fs.unlink(src, callback) }) } } } -function moveAcrossDevice (source, dest, overwrite, callback) { - fs.stat(source, (err, stat) => { - if (err) { - callback(err) - return - } +function moveAcrossDevice (src, dest, overwrite, callback) { + fs.stat(src, (err, stat) => { + if (err) return callback(err) if (stat.isDirectory()) { - moveDirAcrossDevice(source, dest, overwrite, callback) + moveDirAcrossDevice(src, dest, overwrite, callback) } else { - moveFileAcrossDevice(source, dest, overwrite, callback) + moveFileAcrossDevice(src, dest, overwrite, callback) } }) } -function moveFileAcrossDevice (source, dest, overwrite, callback) { +function moveFileAcrossDevice (src, dest, overwrite, callback) { const flags = overwrite ? 'w' : 'wx' - const ins = fs.createReadStream(source) + const ins = fs.createReadStream(src) const outs = fs.createWriteStream(dest, { flags }) ins.on('error', err => { @@ -113,7 +103,7 @@ function moveFileAcrossDevice (source, dest, overwrite, callback) { fs.unlink(dest, () => { // note: `err` here is from the input stream errror if (err.code === 'EISDIR' || err.code === 'EPERM') { - moveDirAcrossDevice(source, dest, overwrite, callback) + moveDirAcrossDevice(src, dest, overwrite, callback) } else { callback(err) } @@ -131,11 +121,11 @@ function moveFileAcrossDevice (source, dest, overwrite, callback) { ins.pipe(outs) function onClose () { - fs.unlink(source, callback) + fs.unlink(src, callback) } } -function moveDirAcrossDevice (source, dest, overwrite, callback) { +function moveDirAcrossDevice (src, dest, overwrite, callback) { const options = { overwrite: false } @@ -150,13 +140,31 @@ function moveDirAcrossDevice (source, dest, overwrite, callback) { } function startNcp () { - ncp(source, dest, options, err => { + ncp(src, dest, options, err => { if (err) return callback(err) - remove(source, callback) + remove(src, callback) }) } } +// return true if dest is a subdir of src, otherwise false. +// extract dest base dir and check if that is the same as src basename +function isSrcSubdir (src, dest, cb) { + fs.stat(src, (err, st) => { + if (err) return cb(err) + if (st.isDirectory()) { + const baseDir = dest.split(path.dirname(src) + path.sep)[1] + if (baseDir) { + const destBasename = baseDir.split(path.sep)[0] + if (destBasename) return cb(null, src !== dest && dest.indexOf(src) > -1 && destBasename === path.basename(src)) + return cb(null, false) + } + return cb(null, false) + } + return cb(null, false) + }) +} + module.exports = { move: u(move) } |