From b3146f0655f96ddf0c342fd0c9298f63b38d6b4c Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Mon, 31 Oct 2022 15:06:31 -0400 Subject: [PATCH] Run copy*() filter before running fs.stat() on items (#971) Fixes #965 --- lib/copy/copy-sync.js | 12 ++---------- lib/copy/copy.js | 35 +++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/lib/copy/copy-sync.js b/lib/copy/copy-sync.js index 551abe0c..30e95222 100644 --- a/lib/copy/copy-sync.js +++ b/lib/copy/copy-sync.js @@ -26,21 +26,12 @@ function copySync (src, dest, opts) { const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts) stat.checkParentPathsSync(src, srcStat, dest, 'copy') - return handleFilterAndCopy(destStat, src, dest, opts) -} - -function handleFilterAndCopy (destStat, src, dest, opts) { if (opts.filter && !opts.filter(src, dest)) return const destParent = path.dirname(dest) if (!fs.existsSync(destParent)) mkdirsSync(destParent) return getStats(destStat, src, dest, opts) } -function startCopy (destStat, src, dest, opts) { - if (opts.filter && !opts.filter(src, dest)) return - return getStats(destStat, src, dest, opts) -} - function getStats (destStat, src, dest, opts) { const statSync = opts.dereference ? fs.statSync : fs.lstatSync const srcStat = statSync(src) @@ -121,8 +112,9 @@ function copyDir (src, dest, opts) { function copyDirItem (item, src, dest, opts) { const srcItem = path.join(src, item) const destItem = path.join(dest, item) + if (opts.filter && !opts.filter(srcItem, destItem)) return const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts) - return startCopy(destStat, srcItem, destItem, opts) + return getStats(destStat, srcItem, destItem, opts) } function onLink (destStat, src, dest, opts) { diff --git a/lib/copy/copy.js b/lib/copy/copy.js index 09d53dfd..53423e0e 100644 --- a/lib/copy/copy.js +++ b/lib/copy/copy.js @@ -35,8 +35,12 @@ function copy (src, dest, opts, cb) { const { srcStat, destStat } = stats stat.checkParentPaths(src, srcStat, dest, 'copy', err => { if (err) return cb(err) - if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb) - return checkParentDir(destStat, src, dest, opts, cb) + runFilter(src, dest, opts, (err, include) => { + if (err) return cb(err) + if (!include) return cb() + + checkParentDir(destStat, src, dest, opts, cb) + }) }) }) } @@ -53,16 +57,10 @@ function checkParentDir (destStat, src, dest, opts, cb) { }) } -function handleFilter (onInclude, destStat, src, dest, opts, cb) { - Promise.resolve(opts.filter(src, dest)).then(include => { - if (include) return onInclude(destStat, src, dest, opts, cb) - return cb() - }, error => cb(error)) -} - -function startCopy (destStat, src, dest, opts, cb) { - if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb) - return getStats(destStat, src, dest, opts, cb) +function runFilter (src, dest, opts, cb) { + if (!opts.filter) return cb(null, true) + Promise.resolve(opts.filter(src, dest)) + .then(include => cb(null, include), error => cb(error)) } function getStats (destStat, src, dest, opts, cb) { @@ -178,12 +176,17 @@ function copyDirItems (items, src, dest, opts, cb) { function copyDirItem (items, item, src, dest, opts, cb) { const srcItem = path.join(src, item) const destItem = path.join(dest, item) - stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => { + runFilter(srcItem, destItem, opts, (err, include) => { if (err) return cb(err) - const { destStat } = stats - startCopy(destStat, srcItem, destItem, opts, err => { + if (!include) return copyDirItems(items, src, dest, opts, cb) + + stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => { if (err) return cb(err) - return copyDirItems(items, src, dest, opts, cb) + const { destStat } = stats + getStats(destStat, srcItem, destItem, opts, err => { + if (err) return cb(err) + return copyDirItems(items, src, dest, opts, cb) + }) }) }) }