青木です。

  In mail "[ruby-dev:24024] Re: 1.8.2-preview2?"
    nobu / ruby-lang.org wrote:

> なかだです。

> > これですが、cp_r 'a', 'b' が a/* → b/* のコピーになるんですよね?
> > できるだけ動作は cp(1) 互換にしておきたいので、仕様を変えてしまう
> > のはちょっと……。
> 
> GNU cpでも現在のfileutils.rbでもそうなってると思いますが。
> 
>   $ ls old
>   a  b  c
>   $ rm -fr new
>   $ cp -r old new
>   $ ls new
>   a  b  c

あ、いや、そうでなくて new が存在する場合のことを言ってたん
ですが、それはそれでパッチを読み違えてました。

ちょっと混乱してきたので整理します。


= 元々のメール [ruby-talk:101077] のエラーの原因

なんか報告にある行数と微妙に合わないんですが、行の内容を見る
限り、fu_same? で Errno::ENOENT になっているようです。が、
fu_same? は当時も今も

  def fu_same?(a, b)
    if have_st_ino?
      st1 = File.stat(a)
      st2 = File.stat(b)
      st1.dev == st2.dev and st1.ino == st2.ino
    else
      File.expand_path(a) == File.expand_path(b)
    end
  rescue Errno::ENOENT
    return false
  end

となっており、ENOENT が外に出るのは明らかに変です。従って、
この報告は何か間違っていると思います。


= 中田さんのパッチの解釈

cp_r %w(src1 src2), 'destdir' のように第一引数が配列のときは、
無条件に destdir を作成する。


で、これはアグレッシブすぎるのでとりこめません。
少なくとも 1.8 には入れるべきでないと思います。
-------------------------------------------------------------------
青木峰郎