Overwrite destination symlink file if `remove_destination` is set.

[Bug #13914][ruby-core:82846] Patch by @mzp
  https://github.com/ruby/fileutils/pull/9

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60218 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
hsbt 2017-10-20 07:03:11 +00:00
Родитель 418771316c
Коммит 0242f7ccae
2 изменённых файлов: 20 добавлений и 3 удалений

Просмотреть файл

@ -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)

Просмотреть файл

@ -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