Bug in FileUtils.ln_s?

FileUtils.ln_s is supposed to do this:

  ln_s(old, new, options = {})

  Creates a symbolic link new which points to old. If new already
  exists and it is a directory, creates a symbolic link +new/old+.
  If new already exists and it is not a directory, raises
  Errno::EEXIST. But if :force option is set, overwrite new.

But in this case something is wrong:

$ mkdir foo
$ echo 1>t.rb
$ ruby -r fileutils -e ‘FileUtils.ln_s “t.rb”, “foo/t.rb”’
$ ls -l foo
total 0
lrwxrwxrwx 1 vjoel vjoel 4 2009-06-12 14:47 t.rb -> t.rb

Why is this a cyclic link?

However, if the old filename is in /tmp, there is no problem:

$ rm foo/t.rb
rm: remove symbolic link `foo/t.rb’? y
$ ruby -r fileutils -e ‘FileUtils.ln_s “/tmp/t.rb”, “foo/t.rb”’
$ ls -l foo
total 0
lrwxrwxrwx 1 vjoel vjoel 9 2009-06-12 14:48 t.rb -> /tmp/t.rb

This is with:

$ ruby -v
ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux]

Joel VanderWerf wrote:

But in this case something is wrong:

$ mkdir foo
$ echo 1>t.rb
$ ruby -r fileutils -e ‘FileUtils.ln_s “t.rb”, “foo/t.rb”’
$ ls -l foo
total 0
lrwxrwxrwx 1 vjoel vjoel 4 2009-06-12 14:47 t.rb -> t.rb

Why is this a cyclic link?

Bah, that’s the way ln(1) behaves, and I forgot. Moral of the story,
it’s a symbolic link; #ln_s just creates a link to the string you give
it, without relativizing to the current dir or anything.