@@ -24,8 +24,8 @@ import tmpdir from '../common/tmpdir.js';
24
24
tmpdir . refresh ( ) ;
25
25
26
26
let dirc = 0 ;
27
- function nextdir ( ) {
28
- return tmpdir . resolve ( `copy_${ ++ dirc } ` ) ;
27
+ function nextdir ( dirname ) {
28
+ return tmpdir . resolve ( dirname || `copy_${ ++ dirc } ` ) ;
29
29
}
30
30
31
31
// Synchronous implementation of copy.
@@ -312,6 +312,45 @@ function nextdir() {
312
312
) ;
313
313
}
314
314
315
+ // It must not throw error if attempt is made to copy to dest
316
+ // directory with same prefix as src directory
317
+ // regression test for https://github.com/nodejs/node/issues/54285
318
+ {
319
+ const src = nextdir ( 'prefix' ) ;
320
+ const dest = nextdir ( 'prefix-a' ) ;
321
+ mkdirSync ( src ) ;
322
+ mkdirSync ( dest ) ;
323
+ cpSync ( src , dest , mustNotMutateObjectDeep ( { recursive : true } ) ) ;
324
+ }
325
+
326
+ // It must not throw error if attempt is made to copy to dest
327
+ // directory if the parent of dest has same prefix as src directory
328
+ // regression test for https://github.com/nodejs/node/issues/54285
329
+ {
330
+ const src = nextdir ( 'aa' ) ;
331
+ const destParent = nextdir ( 'aaa' ) ;
332
+ const dest = nextdir ( 'aaa/aabb' ) ;
333
+ mkdirSync ( src ) ;
334
+ mkdirSync ( destParent ) ;
335
+ mkdirSync ( dest ) ;
336
+ cpSync ( src , dest , mustNotMutateObjectDeep ( { recursive : true } ) ) ;
337
+ }
338
+
339
+ // It throws error if attempt is made to copy src to dest
340
+ // when src is parent directory of the parent of dest
341
+ {
342
+ const src = nextdir ( 'a' ) ;
343
+ const destParent = nextdir ( 'a/b' ) ;
344
+ const dest = nextdir ( 'a/b/c' ) ;
345
+ mkdirSync ( src ) ;
346
+ mkdirSync ( destParent ) ;
347
+ mkdirSync ( dest ) ;
348
+ assert . throws (
349
+ ( ) => cpSync ( src , dest , mustNotMutateObjectDeep ( { recursive : true } ) ) ,
350
+ { code : 'ERR_FS_CP_EINVAL' } ,
351
+ ) ;
352
+ }
353
+
315
354
// It throws error if attempt is made to copy to subdirectory of self.
316
355
{
317
356
const src = './test/fixtures/copy/kitchen-sink' ;
0 commit comments