@@ -63,15 +63,16 @@ async function cpFn(src, dest, opts) {
6363 process . emitWarning ( warning , 'TimestampPrecisionWarning' ) ;
6464 }
6565 const stats = await checkPaths ( src , dest , opts ) ;
66- const { srcStat, destStat } = stats ;
66+ const { srcStat, destStat, skipped } = stats ;
67+ if ( skipped ) return ;
6768 await checkParentPaths ( src , srcStat , dest ) ;
68- if ( opts . filter ) {
69- return handleFilter ( checkParentDir , destStat , src , dest , opts ) ;
70- }
7169 return checkParentDir ( destStat , src , dest , opts ) ;
7270}
7371
7472async function checkPaths ( src , dest , opts ) {
73+ if ( opts . filter && ! ( await opts . filter ( src , dest ) ) ) {
74+ return { __proto__ : null , skipped : true } ;
75+ }
7576 const { 0 : srcStat , 1 : destStat } = await getStats ( src , dest , opts ) ;
7677 if ( destStat ) {
7778 if ( areIdentical ( srcStat , destStat ) ) {
@@ -114,7 +115,7 @@ async function checkPaths(src, dest, opts) {
114115 code : 'EINVAL' ,
115116 } ) ;
116117 }
117- return { srcStat, destStat } ;
118+ return { srcStat, destStat, skipped : false } ;
118119}
119120
120121function areIdentical ( srcStat , destStat ) {
@@ -190,18 +191,6 @@ function isSrcSubdir(src, dest) {
190191 return ArrayPrototypeEvery ( srcArr , ( cur , i ) => destArr [ i ] === cur ) ;
191192}
192193
193- async function handleFilter ( onInclude , destStat , src , dest , opts , cb ) {
194- const include = await opts . filter ( src , dest ) ;
195- if ( include ) return onInclude ( destStat , src , dest , opts , cb ) ;
196- }
197-
198- function startCopy ( destStat , src , dest , opts ) {
199- if ( opts . filter ) {
200- return handleFilter ( getStatsForCopy , destStat , src , dest , opts ) ;
201- }
202- return getStatsForCopy ( destStat , src , dest , opts ) ;
203- }
204-
205194async function getStatsForCopy ( destStat , src , dest , opts ) {
206195 const statFn = opts . dereference ? stat : lstat ;
207196 const srcStat = await statFn ( src ) ;
@@ -328,8 +317,8 @@ async function copyDir(src, dest, opts) {
328317 for await ( const { name } of dir ) {
329318 const srcItem = join ( src , name ) ;
330319 const destItem = join ( dest , name ) ;
331- const { destStat } = await checkPaths ( srcItem , destItem , opts ) ;
332- await startCopy ( destStat , srcItem , destItem , opts ) ;
320+ const { destStat, skipped } = await checkPaths ( srcItem , destItem , opts ) ;
321+ if ( ! skipped ) await getStatsForCopy ( destStat , srcItem , destItem , opts ) ;
333322 }
334323}
335324
0 commit comments