summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/fileutils.rb2
-rw-r--r--test/fileutils/test_fileutils.rb21
2 files changed, 20 insertions, 3 deletions
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 @@ module FileUtils
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..1efc371c55 100644
--- a/test/fileutils/test_fileutils.rb
+++ b/test/fileutils/test_fileutils.rb
@@ -12,7 +12,7 @@ class TestFileUtils < Test::Unit::TestCase
include Test::Unit::FileAssertions
def assert_output_lines(expected, fu = self, message=nil)
- old = fu.instance_variable_get(:@fileutils_output)
+ old = fu.instance_variables.include?(:@fileutils_output) && fu.instance_variable_get(:@fileutils_output)
IO.pipe {|read, write|
fu.instance_variable_set(:@fileutils_output, write)
th = Thread.new { read.read }
@@ -438,6 +438,15 @@ class TestFileUtils < Test::Unit::TestCase
}
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
@@ -1401,7 +1410,7 @@ class TestFileUtils < Test::Unit::TestCase
def test_chown_R_without_permission
touch 'tmp/a'
- exception = assert_raise(Errno::EPERM) {
+ assert_raise(Errno::EPERM) {
chown_R UID_1, nil, 'tmp/a'
chown_R UID_2, nil, 'tmp/a'
}
@@ -1438,6 +1447,14 @@ class TestFileUtils < Test::Unit::TestCase
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