diff --git a/lib/fileutils.rb b/lib/fileutils.rb index 37945b4096..adff31c944 100644 --- a/lib/fileutils.rb +++ b/lib/fileutils.rb @@ -412,7 +412,7 @@ def cp_r(src, dest, preserve: nil, noop: nil, verbose: nil, def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false) Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent| destent = Entry_.new(dest, ent.rel, false) - File.unlink destent.path if remove_destination && File.file?(destent.path) + File.unlink destent.path if remove_destination && (File.file?(destent.path) || File.symlink?(destent.path)) ent.copy destent.path end, proc do |ent| destent = Entry_.new(dest, ent.rel, false) diff --git a/test/fileutils/test_fileutils.rb b/test/fileutils/test_fileutils.rb index bc659c2a0a..35b5194b59 100644 --- a/test/fileutils/test_fileutils.rb +++ b/test/fileutils/test_fileutils.rb @@ -438,6 +438,15 @@ def test_cp_r_pathname } end + def test_cp_r_symlink_remove_destination + Dir.mkdir 'tmp/src' + Dir.mkdir 'tmp/dest' + Dir.mkdir 'tmp/src/dir' + File.symlink 'tmp/src/dir', 'tmp/src/a' + cp_r 'tmp/src', 'tmp/dest/', remove_destination: true + cp_r 'tmp/src', 'tmp/dest/', remove_destination: true + end + def test_mv check_singleton :mv @@ -1438,6 +1447,14 @@ def test_copy_entry_symlink assert_equal 'somewhere', File.readlink('tmp/dirdest/sym') end if have_symlink? + def test_copy_entry_symlink_remove_destination + Dir.mkdir 'tmp/dir' + File.symlink 'tmp/dir', 'tmp/dest' + touch 'tmp/src' + copy_entry 'tmp/src', 'tmp/dest', false, false, true + assert_file_exist 'tmp/dest' + end + def test_copy_file check_singleton :copy_file