Skip to content

Commit b3146f0

Browse files
authored
Run copy*() filter before running fs.stat() on items (#971)
Fixes #965
1 parent 1d1622b commit b3146f0

File tree

2 files changed

+21
-26
lines changed

2 files changed

+21
-26
lines changed

lib/copy/copy-sync.js

+2-10
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,12 @@ function copySync (src, dest, opts) {
2626

2727
const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts)
2828
stat.checkParentPathsSync(src, srcStat, dest, 'copy')
29-
return handleFilterAndCopy(destStat, src, dest, opts)
30-
}
31-
32-
function handleFilterAndCopy (destStat, src, dest, opts) {
3329
if (opts.filter && !opts.filter(src, dest)) return
3430
const destParent = path.dirname(dest)
3531
if (!fs.existsSync(destParent)) mkdirsSync(destParent)
3632
return getStats(destStat, src, dest, opts)
3733
}
3834

39-
function startCopy (destStat, src, dest, opts) {
40-
if (opts.filter && !opts.filter(src, dest)) return
41-
return getStats(destStat, src, dest, opts)
42-
}
43-
4435
function getStats (destStat, src, dest, opts) {
4536
const statSync = opts.dereference ? fs.statSync : fs.lstatSync
4637
const srcStat = statSync(src)
@@ -121,8 +112,9 @@ function copyDir (src, dest, opts) {
121112
function copyDirItem (item, src, dest, opts) {
122113
const srcItem = path.join(src, item)
123114
const destItem = path.join(dest, item)
115+
if (opts.filter && !opts.filter(srcItem, destItem)) return
124116
const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts)
125-
return startCopy(destStat, srcItem, destItem, opts)
117+
return getStats(destStat, srcItem, destItem, opts)
126118
}
127119

128120
function onLink (destStat, src, dest, opts) {

lib/copy/copy.js

+19-16
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@ function copy (src, dest, opts, cb) {
3535
const { srcStat, destStat } = stats
3636
stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
3737
if (err) return cb(err)
38-
if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
39-
return checkParentDir(destStat, src, dest, opts, cb)
38+
runFilter(src, dest, opts, (err, include) => {
39+
if (err) return cb(err)
40+
if (!include) return cb()
41+
42+
checkParentDir(destStat, src, dest, opts, cb)
43+
})
4044
})
4145
})
4246
}
@@ -53,16 +57,10 @@ function checkParentDir (destStat, src, dest, opts, cb) {
5357
})
5458
}
5559

56-
function handleFilter (onInclude, destStat, src, dest, opts, cb) {
57-
Promise.resolve(opts.filter(src, dest)).then(include => {
58-
if (include) return onInclude(destStat, src, dest, opts, cb)
59-
return cb()
60-
}, error => cb(error))
61-
}
62-
63-
function startCopy (destStat, src, dest, opts, cb) {
64-
if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
65-
return getStats(destStat, src, dest, opts, cb)
60+
function runFilter (src, dest, opts, cb) {
61+
if (!opts.filter) return cb(null, true)
62+
Promise.resolve(opts.filter(src, dest))
63+
.then(include => cb(null, include), error => cb(error))
6664
}
6765

6866
function getStats (destStat, src, dest, opts, cb) {
@@ -178,12 +176,17 @@ function copyDirItems (items, src, dest, opts, cb) {
178176
function copyDirItem (items, item, src, dest, opts, cb) {
179177
const srcItem = path.join(src, item)
180178
const destItem = path.join(dest, item)
181-
stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => {
179+
runFilter(srcItem, destItem, opts, (err, include) => {
182180
if (err) return cb(err)
183-
const { destStat } = stats
184-
startCopy(destStat, srcItem, destItem, opts, err => {
181+
if (!include) return copyDirItems(items, src, dest, opts, cb)
182+
183+
stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => {
185184
if (err) return cb(err)
186-
return copyDirItems(items, src, dest, opts, cb)
185+
const { destStat } = stats
186+
getStats(destStat, srcItem, destItem, opts, err => {
187+
if (err) return cb(err)
188+
return copyDirItems(items, src, dest, opts, cb)
189+
})
187190
})
188191
})
189192
}

0 commit comments

Comments
 (0)