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'