From: Tanaka Akira Date: 2009-01-23T04:17:59+09:00 Subject: [ruby-dev:37827] Re: adding Pathname#resolve (was: adding Pathname#abspath()) In article <86mydj1pss.knu@iDaemons.org>, "Akinori MUSHA" writes: >> >  まれなケースなので固執はしませんが、先の例の link を creat(2) >> > ないし O_CREAT 付きで open(2) すれば dir/file にファイルができる >> > というのは事実で、 realdirpath でわざわざsymlinkを意識した処理を >> > するからにはそれを織り込みたい場合もあるはずだとは思います。 > >  実際にあった例では、パス名を生成する段階で > > # copy src to dst > srcpath = Pathname(src).realpath > > dstpath = Pathname(dst) > if dstpath.exist? > dstpath = dstpath.realpath > else > dstpath = dstpath.dirname.realpath + dstpath.basename > end > > と存在チェック(の記述)が必要で、実際に処理を行うときにもまた > > if dstpath.exist? > # differential copy > else > # full copy > end > > とする必要があるのが冗長に感じました。さらに、 > > if srcpath.dirname.dev != dstpath.dirname.dev > # cross-device copy > ... > end > > というテストが実際には先の理由から正しくないということがあり、 > 結局欲しいのは4.4BSDの realpath(3) じゃないか、というのが動機 > でした。 cross-device copy の判断という必要性は具体的でわかりやすいで すね。たしかに、ファイルが存在しない段階で、ファイルを作った としたらどの directory/device に作られるのか、というのを realpath を使って判断するのはうまくいきません。 前半の冗長性と realdirpath の関係はわかりません。 >  もしかすると、 Pathname#realpath が省略可能のブロックを受け > 付けるようにして、 > > path.realpath { |resolved, unresolved| > unresolved.to_s.include?("/") ? raise ENOTDIR : resolved + unresolved > } > > みたいなハンドラを書けるといいのかな。そうすると rsync のように > まだ存在しないディレクトリを生成したりする処理を書きやすくなる > かも。(.to_s.include?("/") というのがいまいちですが) どうですかねぇ。 >> まだまじめに考えていませんが Apache で PUT で と >> いうのをちょっと思いついたんですが、どうかなぁ。 > >  ここはちょっと意味が分かりませんでした。 のような制約の実現には realdirpath が必要になる のではないかという推測です。 -- [田中 哲][たなか あきら][Tanaka Akira]