|
|
@ -16,18 +16,15 @@ function ncp (source, dest, options, callback) { |
|
|
|
|
|
|
|
var filter = options.filter |
|
|
|
var transform = options.transform |
|
|
|
var clobber = options.clobber !== false |
|
|
|
var clobber = options.clobber !== false // default true
|
|
|
|
var dereference = options.dereference |
|
|
|
var preserveTimestamps = options.preserveTimestamps === true |
|
|
|
|
|
|
|
var errs = null |
|
|
|
|
|
|
|
var started = 0 |
|
|
|
var finished = 0 |
|
|
|
var running = 0 |
|
|
|
// this is pretty useless now that we're using graceful-fs
|
|
|
|
// consider removing
|
|
|
|
var limit = options.limit || 512 |
|
|
|
|
|
|
|
var errored = false |
|
|
|
|
|
|
|
startCopy(currentPath) |
|
|
|
|
|
|
@ -49,11 +46,6 @@ function ncp (source, dest, options, callback) { |
|
|
|
|
|
|
|
function getStats (source) { |
|
|
|
var stat = dereference ? fs.stat : fs.lstat |
|
|
|
if (running >= limit) { |
|
|
|
return setImmediate(function () { |
|
|
|
getStats(source) |
|
|
|
}) |
|
|
|
} |
|
|
|
running++ |
|
|
|
stat(source, function (err, stats) { |
|
|
|
if (err) return onError(err) |
|
|
@ -89,7 +81,11 @@ function ncp (source, dest, options, callback) { |
|
|
|
copyFile(file, target) |
|
|
|
}) |
|
|
|
} else { |
|
|
|
doneOne() |
|
|
|
var err = new Error('EEXIST: ' + target + ' already exists.') |
|
|
|
err.code = 'EEXIST' |
|
|
|
err.errno = -17 |
|
|
|
err.path = target |
|
|
|
onError(err) |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
@ -133,7 +129,7 @@ function ncp (source, dest, options, callback) { |
|
|
|
} |
|
|
|
|
|
|
|
function onDir (dir) { |
|
|
|
var target = dir.name.replace(currentPath, targetPath) |
|
|
|
var target = dir.name.replace(currentPath, targetPath.replace('$', '$$$$')) // escapes '$' with '$$'
|
|
|
|
isWritable(target, function (writable) { |
|
|
|
if (writable) { |
|
|
|
return mkDir(dir, target) |
|
|
@ -214,19 +210,11 @@ function ncp (source, dest, options, callback) { |
|
|
|
} |
|
|
|
|
|
|
|
function onError (err) { |
|
|
|
if (options.stopOnError) { |
|
|
|
// ensure callback is defined & called only once:
|
|
|
|
if (!errored && callback !== undefined) { |
|
|
|
errored = true |
|
|
|
return callback(err) |
|
|
|
} else if (!errs && options.errs) { |
|
|
|
errs = fs.createWriteStream(options.errs) |
|
|
|
} else if (!errs) { |
|
|
|
errs = [] |
|
|
|
} |
|
|
|
if (typeof errs.write === 'undefined') { |
|
|
|
errs.push(err) |
|
|
|
} else { |
|
|
|
errs.write(err.stack + '\n\n') |
|
|
|
} |
|
|
|
return doneOne() |
|
|
|
} |
|
|
|
|
|
|
|
function doneOne (skipped) { |
|
|
@ -234,7 +222,7 @@ function ncp (source, dest, options, callback) { |
|
|
|
finished++ |
|
|
|
if ((started === finished) && (running === 0)) { |
|
|
|
if (callback !== undefined) { |
|
|
|
return errs ? callback(errs) : callback(null) |
|
|
|
return callback(null) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|