--pgp-sign-Multipart_Thu_Jan_22_13:22:23_2009-1
Content-Type: text/plain; charset=ISO-2022-JP

At Wed, 21 Jan 2009 21:54:34 +0900,
Tanaka Akira wrote:
> [ruby-dev:36585] を読み返していて、
>
>     elsif path.symlink?
>       dir, base = path.readlink.split
>       (path.dirname + dir).realpath + base
>
> というのが必要だという話がありましたが、これってなぜでしたっけ?
>
> basename の扱いに期待されることについて考えているのですが。

あ、これはまさに、

> > mkdir dir
> > ln -s dir/file link

のときに Pathname("link").realdirpath が /here/dir/file を導いて
ほしいからです。

> >   if path.exist?
> >     path.realname
> >   elsif path.dirname.directory?
> >     path.dirname.realpath + path.basename
> >   else
> >     raise Errno::ENOTDIR
> >   end

このままの実装だと、 link が展開されず /here/link が返ります。

 realpath(3) は、頭からパスコンポーネントを lstat しながら辿り、
symlinkが現れると readlink し、その内容をさらに再帰的に処理して
いきます。lstat の結果が ENOENT のコンポーネントが現れた場合:

POSIX系の仕様では:
    それが最後のコンポーネントなら ENOENT、最後でなければ
    ENOTDIR を返す。

4.4BSD系の仕様では:
    それが最後のコンポーネントならそのまま結合して返す。最後で
    なければ ENOENT を返す。(ENOTDIR の方が適切な気がするのは
    さておき)

という違いがありますが、いずれも最終的に symlink を返すことは
ありません。("real" の意図に反します)

> >  名前については、改めて realdirpath を推します。realpath との
> > 明らかな連関を想起させますし、 real-directory path と書き下して
> > みれば、 real-directory は最後の1つ前のコンポーネント、すなわち
> > 親ディレクトリまで展開することを、 path はディレクトリに限らない
> > ことをよく表しています。
>
> この名前は悪くない気がしてきました。

 ぜひ採用をお願いします。

--
Akinori MUSHA / http://akinori.org/

--pgp-sign-Multipart_Thu_Jan_22_13:22:23_2009-1
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEABECAAYFAkl39H8ACgkQkgvvx5/Z4e5XSgCfbZLMZjBNqqHiYsA2LGw0feg5
I1UAn1Ww2qAr4ut93n73Qcu5BFVvMFcb
=bO/o
-----END PGP SIGNATURE-----

--pgp-sign-Multipart_Thu_Jan_22_13:22:23_2009-1--