Skip to content

Commit

Permalink
fs: respect dereference when copy symlink directory
Browse files Browse the repository at this point in the history
Co-authored-by: Jake Yuesong Li <[email protected]>
PR-URL: #54732
Fixes: #54730
Reviewed-By: Yagiz Nizipli <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
jazelly and jakecastelli authored Sep 5, 2024
1 parent 0debdac commit a48852b
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/node_file.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3155,7 +3155,9 @@ static void CpSyncCheckPaths(const FunctionCallbackInfo<Value>& args) {

bool dest_exists = !error_code && dest_status.type() !=
std::filesystem::file_type::not_found;
bool src_is_dir = src_status.type() == std::filesystem::file_type::directory;
bool src_is_dir =
(src_status.type() == std::filesystem::file_type::directory) ||
(dereference && src_status.type() == std::filesystem::file_type::symlink);

if (!error_code) {
// Check if src and dest are identical.
Expand Down
17 changes: 17 additions & 0 deletions test/parallel/test-fs-cp.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,23 @@ function nextdir() {
}


// It overrides target directory with what symlink points to, when dereference is true.
{
const src = nextdir();
const symlink = nextdir();
const dest = nextdir();
mkdirSync(src, mustNotMutateObjectDeep({ recursive: true }));
writeFileSync(join(src, 'foo.js'), 'foo', 'utf8');
symlinkSync(src, symlink);

mkdirSync(dest, mustNotMutateObjectDeep({ recursive: true }));

cpSync(symlink, dest, mustNotMutateObjectDeep({ dereference: true, recursive: true }));
const destStat = lstatSync(dest);
assert(!destStat.isSymbolicLink());
assertDirEquivalent(src, dest);
}

// It throws error when verbatimSymlinks is not a boolean.
{
const src = './test/fixtures/copy/kitchen-sink';
Expand Down

0 comments on commit a48852b

Please sign in to comment.