|
|
@ -101,13 +101,13 @@ function copyFile (srcStat, src, dest, opts, cb) { |
|
|
|
|
|
|
|
function copyFileFallback (srcStat, src, dest, opts, cb) { |
|
|
|
const rs = fs.createReadStream(src) |
|
|
|
const ws = fs.createWriteStream(dest, { mode: srcStat.mode }) |
|
|
|
|
|
|
|
rs.on('error', err => cb(err)) |
|
|
|
ws.on('error', err => cb(err)) |
|
|
|
|
|
|
|
ws.on('open', () => rs.pipe(ws)) |
|
|
|
.once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb)) |
|
|
|
.once('open', () => { |
|
|
|
const ws = fs.createWriteStream(dest, { mode: srcStat.mode }) |
|
|
|
ws.on('error', err => cb(err)) |
|
|
|
.on('open', () => rs.pipe(ws)) |
|
|
|
.once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb)) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
function setDestModeAndTimestamps (srcStat, dest, opts, cb) { |
|
|
@ -198,8 +198,8 @@ function onLink (src, dest, opts, cb) { |
|
|
|
if (resolvedDestPath === resolvedSrcPath) return cb() |
|
|
|
|
|
|
|
// prevent copy if src is a subdir of dest since unlinking
|
|
|
|
// dest in this case results in removing src contents
|
|
|
|
// and therefore a broken symlink will be created.
|
|
|
|
// dest in this case would result in removing src contents
|
|
|
|
// and therefore a broken symlink would be created.
|
|
|
|
fs.stat(dest, (err, st) => { |
|
|
|
if (err) return cb(err) |
|
|
|
if (st.isDirectory() && isSrcSubdir(resolvedDestPath, resolvedSrcPath)) { |
|
|
|