class method
FileUtils.ln_sr
(::FileUtils::pathlist src, ::FileUtils::path dest, ?target_directory: ::boolish, ?noop: ::boolish, ?verbose: ::boolish) -> void
ln_sr(src, dest, target_directory: true, force: nil, noop: nil, verbose: nil)
lib/fileutils.rb
View on GitHub ↗
# File tmp/rubies/ruby-4.0.0/lib/fileutils.rb, line 733
def ln_sr(src, dest, target_directory: true, force: nil, noop: nil, verbose: nil)
cmd = "ln -s#{force ? 'f' : ''}#{target_directory ? '' : 'T'}" if verbose
fu_each_src_dest0(src, dest, target_directory) do |s,d|
if target_directory
parent = File.dirname(d)
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.realdirpath(dest))
end
srcdirs = fu_split_path(s)
i = fu_common_components(srcdirs, destdirs)
n = destdirs.size - i
n -= 1 unless target_directory
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
next if noop
remove_file d, true if force
File.symlink s, d
end
end
Like FileUtils.ln_s, but create links relative to dest.