fileutils icon indicating copy to clipboard operation
fileutils copied to clipboard

Mangled generated path on `ln_s` with `relative: true`

Open delfianto opened this issue 8 months ago • 4 comments

I found this accidently when trying to wrote a dotfile linker utility.

Seems like FileUtils.ln_s will fail when the resulting relative path contains ../ (one directory hierarchy higher) as the relative path being generated is mangled.

Sample snippets to reproduce:

FileUtils.ln_s(
  "/home/mipan/.dotfiles/zsh", "/home/mipan/.config/zsh",
   verbose: true, noop: true, relative: true
)

Output: ln -s  /home/mipan/.config/zsh/zsh

And this is not a pure logging bug, when the noop set to false:

FileUtils.ln_s(
  "/home/mipan/.dotfiles/zsh", "/home/mipan/.config/zsh",
   verbose: true, noop: false, relative: true
)

ln -s  /home/mipan/.config/zsh/zsh
/usr/lib/ruby/3.4.0/fileutils.rb:760:in 'File.symlink': No such file or directory @ rb_file_s_symlink - (, /home/mipan/.config/zsh/zsh) (Errno::ENOENT)
	from /usr/lib/ruby/3.4.0/fileutils.rb:760:in 'block in FileUtils.ln_sr'
	from /usr/lib/ruby/3.4.0/fileutils.rb:765:in 'FileUtils.ln_sr'
	from /usr/lib/ruby/3.4.0/fileutils.rb:709:in 'FileUtils.ln_s'
	from ./dot_linker.rb:362:in '<main>'

Sample for working parameters:

FileUtils.ln_s(
  "/home/mipan/.dotfiles/zsh", "/home/mipan/zsh",
   verbose: true, noop: true, relative: true
)

Output: ln -s .dotfiles/zsh /home/mipan/zsh

Ruby version:

❯ ruby --version
ruby 3.4.4 (2025-05-14 revision a38531fd3f) +PRISM [x86_64-linux]

delfianto avatar May 25 '25 15:05 delfianto

Are the paths existing real paths?

nobu avatar Jul 19 '25 09:07 nobu

This part /home/mipan/.dotfiles/zsh is a real path (not a symlink), on my system this is where i store all my dotfiles.

~ via 💎 v3.4.4 
❯ file /home/mipan/.dotfiles    
/home/mipan/.dotfiles: directory

~ via 💎 v3.4.4 
❯ file /home/mipan/.dotfiles/zsh
/home/mipan/.dotfiles/zsh: directory

~ via 💎 v3.4.4 
❯ file /home/mipan/.config 
/home/mipan/.config: directory

delfianto avatar Jul 19 '25 10:07 delfianto

Could you try the recent commit?

nobu avatar Jul 19 '25 13:07 nobu

Using the most recent commit from master, I found some interesting behavior.

Test script

#!/usr/bin/env ruby

require 'fileutils'
puts FileUtils.method(:cp).source_location
puts FileUtils::VERSION

FileUtils.ln_s(
  "/tmp/.dotfiles/zsh", "/tmp/.config/zsh",
   verbose: true, noop: true, relative: true
)

Attempt 1 (/tmp/.config/zsh symlink does not exist yet)

~/dev/ruby_src via 💎 v3.4.4 
❯ file /tmp/.dotfiles/zsh 
/tmp/.dotfiles/zsh: directory

~/dev/ruby_src via 💎 v3.4.4 
❯ file /tmp/.config 
/tmp/.config: directory

~/dev/ruby_src via 💎 v3.4.4 
❯ file /tmp/.config/zsh
/tmp/.config/zsh: cannot open `/tmp/.config/zsh' (No such file or directory)

~/dev/ruby_src via 💎 v3.4.4 
❯ ./futils_test.rb 
/home/mipan/.rbenv/versions/3.4.4/lib/ruby/gems/3.4.0/gems/fileutils-1.7.3/lib/fileutils.rb
870
1.7.3
ln -s ../.dotfiles/zsh /tmp/.config/zsh

~/dev/ruby_src via 💎 v3.4.4 
❯ # works as expected

Attempt 2 (/tmp/.config/zsh already exist as symlink)

~/dev/ruby_src via 💎 v3.4.4 
❯ ./futils_test.rb        
/home/mipan/.rbenv/versions/3.4.4/lib/ruby/gems/3.4.0/gems/fileutils-1.7.3/lib/fileutils.rb
870
1.7.3
ln -s  /tmp/.config/zsh/zsh
/home/mipan/.rbenv/versions/3.4.4/lib/ruby/gems/3.4.0/gems/fileutils-1.7.3/lib/fileutils.rb:763:in 'File.symlink': No such file or directory @ rb_file_s_symlink - (, /tmp/.config/zsh/zsh) (Errno::ENOENT)
	from /home/mipan/.rbenv/versions/3.4.4/lib/ruby/gems/3.4.0/gems/fileutils-1.7.3/lib/fileutils.rb:763:in 'block in FileUtils.ln_sr'
	from /home/mipan/.rbenv/versions/3.4.4/lib/ruby/gems/3.4.0/gems/fileutils-1.7.3/lib/fileutils.rb:2486:in 'FileUtils.fu_each_src_dest0'
	from /home/mipan/.rbenv/versions/3.4.4/lib/ruby/gems/3.4.0/gems/fileutils-1.7.3/lib/fileutils.rb:735:in 'FileUtils.ln_sr'
	from /home/mipan/.rbenv/versions/3.4.4/lib/ruby/gems/3.4.0/gems/fileutils-1.7.3/lib/fileutils.rb:709:in 'FileUtils.ln_s'
	from ./futils_test.rb:7:in '<main>'

~/dev/ruby_src via 💎 v3.4.4 
❯ # mangled path 

Hope this clarifies things.

delfianto avatar Jul 19 '25 16:07 delfianto