[#37679] [FEATURE:trunk] EncDet again — "Yugui (Yuki Sonoda)" <yugui@...>

Yuguiです。

23 messages 2009/01/03

[#37748] $LOAD_PATHとバージョンの運用の関係 — akira yamada / やまだあきら <akira@...>

1.9系でのバージョンの運用と$LOAD_PATHの値について質問です。

12 messages 2009/01/09
[#37758] Re: $LOAD_PATHとバージョンの運用の関係 — "NARUSE, Yui" <naruse@...> 2009/01/11

成瀬です。

[ruby-dev:37814] Re: adding Pathname#resolve (was: adding Pathname#abspath())

From: "Akinori MUSHA" <knu@...>
Date: 2009-01-22 04:20:27 UTC
List: ruby-dev #37814
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/

In This Thread