diff --git a/lib/fileutils.rb b/lib/fileutils.rb
index acda98b..9236bb3 100644
--- a/lib/fileutils.rb
+++ b/lib/fileutils.rb
@@ -715,7 +715,7 @@ def cp_lr(src, dest, noop: nil, verbose: nil,
# Keyword arguments:
#
# - force: true - overwrites +dest+ if it exists.
- # - relative: false - create links relative to +dest+.
+ # - relative: true - create links relative to +dest+.
# - noop: true - does not create links.
# - verbose: true - prints an equivalent command:
#
@@ -783,7 +783,7 @@ def ln_sr(src, dest, target_directory: true, force: nil, noop: nil, verbose: nil
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
+ link1 = link2 if !link2.empty? and link1.size > link2.size
end
s = File.join(link1)
fu_output_message [cmd, s, d].flatten.join(' ') if verbose
diff --git a/test/fileutils/test_fileutils.rb b/test/fileutils/test_fileutils.rb
index 92308d9..3a2ad32 100644
--- a/test/fileutils/test_fileutils.rb
+++ b/test/fileutils/test_fileutils.rb
@@ -979,6 +979,32 @@ def test_ln_s
end
end if have_symlink? and !no_broken_symlink?
+ def test_ln_s_relative_to_symlinked_directory
+ mkdir_p 'tmp/symlink_dir/.dotfiles/zsh'
+ mkdir_p 'tmp/symlink_dir/.config'
+
+ src = File.expand_path('tmp/symlink_dir/.dotfiles/zsh')
+ dest = File.expand_path('tmp/symlink_dir/.config/zsh')
+
+ assert_output_lines(["ln -s ../.dotfiles/zsh #{dest}"]) {
+ ln_s src, dest, relative: true, verbose: true, noop: true
+ }
+
+ ln_s src, dest, relative: true
+ assert_file.symlink?(dest)
+ assert_equal '../.dotfiles/zsh', File.readlink(dest)
+
+ lnfname = File.join(dest, 'zsh')
+ assert_output_lines(["ln -s ../../.dotfiles/zsh #{lnfname}"]) {
+ ln_s src, dest, relative: true, verbose: true, noop: true
+ }
+
+ ln_s src, dest, relative: true
+ assert_file.symlink?(lnfname)
+ assert_equal '../../.dotfiles/zsh', File.readlink(lnfname)
+ assert_equal File.realpath(src), File.realpath(lnfname)
+ end if have_symlink? and !no_broken_symlink?
+
def test_ln_s_broken_symlink
assert_nothing_raised {
ln_s 'symlink', 'tmp/symlink'