diff --git a/lib/internal/fs/cp/cp-sync.js b/lib/internal/fs/cp/cp-sync.js index f9d159a193107e..20c77fc7cb1631 100644 --- a/lib/internal/fs/cp/cp-sync.js +++ b/lib/internal/fs/cp/cp-sync.js @@ -158,11 +158,6 @@ function handleFilterAndCopy(destStat, src, dest, opts) { 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 statSyncFn = opts.dereference ? statSync : lstatSync; const srcStat = statSyncFn(src); @@ -284,9 +279,9 @@ function copyDir(src, dest, opts) { const { name } = dirent; const srcItem = join(src, name); const destItem = join(dest, name); + if (opts.filter && !opts.filter(srcItem, destItem)) continue; const { destStat } = checkPathsSync(srcItem, destItem, opts); - - startCopy(destStat, srcItem, destItem, opts); + getStats(destStat, srcItem, destItem, opts); } } finally { dir.closeSync(); diff --git a/test/parallel/test-fs-cp.mjs b/test/parallel/test-fs-cp.mjs index 7181bb636699b0..60939a3c718946 100644 --- a/test/parallel/test-fs-cp.mjs +++ b/test/parallel/test-fs-cp.mjs @@ -336,6 +336,24 @@ if (!isWindows) { }, { code: 'ERR_INVALID_RETURN_VALUE' }); } +// It should not throw exception if child folder +// is filtered out. +{ + // Create a file in dest with the same name as a child folder in src + // expect: this shouldn't throw error since filtered out by filter function + const src = nextdir(); + mkdirSync(join(src, 'foo'), mustNotMutateObjectDeep({ recursive: true })); + + const dest = nextdir(); + mkdirSync(dest, mustNotMutateObjectDeep({ recursive: true })); + writeFileSync(join(dest, 'foo'), 'foo-content', mustNotMutateObjectDeep({ mode: 0o444 })); + + cpSync(src, dest, { + filter: (path) => !path.includes('foo'), + recursive: true, + }); +} + // It throws error if errorOnExist is true, force is false, and file or folder // copied over. {