Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 434fcd7

Browse filesBrowse files
npaunaduh95
authored andcommitted
fs: fix errorOnExist behavior for directory copy in fs.cp
PR-URL: #60946 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Dario Piotrowicz <dario.piotrowicz@gmail.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com> Reviewed-By: Beth Griggs <bethanyngriggs@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 399ac68 commit 434fcd7
Copy full SHA for 434fcd7

2 files changed

+40-1Lines changed: 40 additions & 1 deletion

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎lib/internal/fs/cp/cp.js‎

Copy file name to clipboardExpand all lines: lib/internal/fs/cp/cp.js
+10-1Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,17 @@ async function setDestTimestamps(src, dest) {
300300
return utimes(dest, updatedSrcStat.atime, updatedSrcStat.mtime);
301301
}
302302

303-
function onDir(srcStat, destStat, src, dest, opts) {
303+
async function onDir(srcStat, destStat, src, dest, opts) {
304304
if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts);
305+
if (opts.errorOnExist && !opts.force) {
306+
throw new ERR_FS_CP_EEXIST({
307+
message: `${dest} already exists`,
308+
path: dest,
309+
syscall: 'cp',
310+
errno: EEXIST,
311+
code: 'EEXIST',
312+
});
313+
}
305314
return copyDir(src, dest, opts);
306315
}
307316

Collapse file
+30Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// This tests that cp() returns error if errorOnExist is true, force is false,
2+
// and the destination directory already exists (even if contents don't conflict).
3+
4+
import { mustCall } from '../common/index.mjs';
5+
import { nextdir } from '../common/fs.js';
6+
import assert from 'node:assert';
7+
import { cp, mkdirSync, writeFileSync } from 'node:fs';
8+
import tmpdir from '../common/tmpdir.js';
9+
10+
tmpdir.refresh();
11+
12+
const src = nextdir();
13+
const dest = nextdir();
14+
15+
// Create source directory with a file
16+
mkdirSync(src);
17+
writeFileSync(`${src}/file.txt`, 'test');
18+
19+
// Create destination directory with different file
20+
mkdirSync(dest);
21+
writeFileSync(`${dest}/other.txt`, 'existing');
22+
23+
// Should fail because dest directory already exists
24+
cp(src, dest, {
25+
recursive: true,
26+
errorOnExist: true,
27+
force: false,
28+
}, mustCall((err) => {
29+
assert.strictEqual(err.code, 'ERR_FS_CP_EEXIST');
30+
}));

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.