mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 16:44:01 +02:00
parent
de68f22042
commit
3dced7955c
2 changed files with 21 additions and 7 deletions
|
@ -732,19 +732,31 @@ module FileUtils
|
||||||
#
|
#
|
||||||
def ln_sr(src, dest, target_directory: true, force: nil, noop: nil, verbose: nil)
|
def ln_sr(src, dest, target_directory: true, force: nil, noop: nil, verbose: nil)
|
||||||
cmd = "ln -s#{force ? 'f' : ''}#{target_directory ? '' : 'T'}" if verbose
|
cmd = "ln -s#{force ? 'f' : ''}#{target_directory ? '' : 'T'}" if verbose
|
||||||
unless target_directory
|
|
||||||
destdirs = fu_split_path(dest)
|
|
||||||
end
|
|
||||||
fu_each_src_dest0(src, dest, target_directory) do |s,d|
|
fu_each_src_dest0(src, dest, target_directory) do |s,d|
|
||||||
if target_directory
|
if target_directory
|
||||||
destdirs = fu_split_path(File.dirname(d))
|
parent = File.dirname(d)
|
||||||
# else d == dest
|
destdirs = fu_split_path(parent)
|
||||||
|
real_ddirs = fu_split_path(File.realpath(parent))
|
||||||
|
else
|
||||||
|
destdirs ||= fu_split_path(dest)
|
||||||
|
real_ddirs ||= fu_split_path(File.realpath(dest))
|
||||||
end
|
end
|
||||||
srcdirs = fu_split_path(s)
|
srcdirs = fu_split_path(s)
|
||||||
i = fu_common_components(srcdirs, destdirs)
|
i = fu_common_components(srcdirs, destdirs)
|
||||||
n = destdirs.size - i
|
n = destdirs.size - i
|
||||||
n -= 1 unless target_directory
|
n -= 1 unless target_directory
|
||||||
s = File.join(fu_clean_components(*Array.new(n, '..'), *srcdirs[i..-1]))
|
link1 = fu_clean_components(*Array.new([n, 0].max, '..'), *srcdirs[i..-1])
|
||||||
|
begin
|
||||||
|
real_sdirs = fu_split_path(File.realdirpath(s)) rescue nil
|
||||||
|
rescue
|
||||||
|
else
|
||||||
|
i = fu_common_components(real_sdirs, real_ddirs)
|
||||||
|
n = real_ddirs.size - i
|
||||||
|
n -= 1 unless target_directory
|
||||||
|
link2 = fu_clean_components(*Array.new([n, 0].max, '..'), *real_sdirs[i..-1])
|
||||||
|
link1 = link2 if link1.size > link2.size
|
||||||
|
end
|
||||||
|
s = File.join(link1)
|
||||||
fu_output_message [cmd, s, d].flatten.join(' ') if verbose
|
fu_output_message [cmd, s, d].flatten.join(' ') if verbose
|
||||||
next if noop
|
next if noop
|
||||||
remove_file d, true if force
|
remove_file d, true if force
|
||||||
|
|
|
@ -1031,7 +1031,8 @@ class TestFileUtils < Test::Unit::TestCase
|
||||||
assert_all_assertions_foreach(nil, *TARGETS) do |fname|
|
assert_all_assertions_foreach(nil, *TARGETS) do |fname|
|
||||||
lnfname = 'tmp/lnsdest'
|
lnfname = 'tmp/lnsdest'
|
||||||
ln_sr fname, lnfname
|
ln_sr fname, lnfname
|
||||||
assert FileTest.symlink?(lnfname), 'not symlink'
|
assert_file.symlink?(lnfname)
|
||||||
|
assert_file.identical?(lnfname, fname)
|
||||||
assert_equal "../#{fname}", File.readlink(lnfname)
|
assert_equal "../#{fname}", File.readlink(lnfname)
|
||||||
ensure
|
ensure
|
||||||
rm_f lnfname
|
rm_f lnfname
|
||||||
|
@ -1060,6 +1061,7 @@ class TestFileUtils < Test::Unit::TestCase
|
||||||
ln_sr 'tmp/src/xxx', 'data'
|
ln_sr 'tmp/src/xxx', 'data'
|
||||||
assert_file.symlink?('data/xxx')
|
assert_file.symlink?('data/xxx')
|
||||||
assert_equal 'ok', File.read('data/xxx')
|
assert_equal 'ok', File.read('data/xxx')
|
||||||
|
assert_equal 'src/xxx', File.readlink('data/xxx')
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_ln_sr_not_target_directory
|
def test_ln_sr_not_target_directory
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue