From: Nobuyoshi Nakada Date: 2009-04-05T13:45:36+09:00 Subject: [ruby-dev:38277] Re: big time なかだです。 At Sun, 5 Apr 2009 07:18:52 +0900, Urabe Shyouhei wrote in [ruby-dev:38275]: > ここまでまとめて返答しますが、想定しているのはFileUtils.touchのような、 > File.utimeへのラッパーライブラリです。FileUtils.touchはFile.utimeが受け付けない > ような引数は受け付けたくないわけです。ところが、田中さんのパッチを当てると > > /usr/lib/ruby/1.9.2/fileutils.rb:1033:in `utime': time out of system range > (ArgumentError) > from /usr/lib/ruby/1.9.2/fileutils.rb:1033:in `block in touch' > from /usr/lib/ruby/1.9.2/fileutils.rb:1030:in `each' > from /usr/lib/ruby/1.9.2/fileutils.rb:1030:in `touch' > from -e:1 > > などというエラーが出ますね?これでは知らない人が見ればFileUtilsにバグがあるよう > に見えるわけです。FileUtilsの側としては、FileUtilsは悪くないわけですから、この > ようなバックトレースを表示せずに、なるならもっと手前のところで例外になってほし > い。つまり、この例で言えば > > -e:1:in `new': time out of range (ArgumentError) > from -e:1 > > とかそんな感じになってほしいわけです。 Time.newが成功したからといってFile.utimeに受け付けられるという保 証は元々ありません。たとえばWindows版ではVFAT上のファイルに1980 年よりも前のタイムスタンプをつけようとすると $ ./ruby -v -e 't = Time.at(0); p File.utime(t, t, "f:/foo")' ruby 1.8.7p5000 (2009-02-24 ruby_1_8 22592) [i386-mswin32] -e:1:in `utime': Invalid argument - f:/foo (Errno::EINVAL) from -e:1 のようにエラーになります。このメッセージ自体があまりよろしくない ということには同意しますが。 ファイルシステム上の時刻表現はファイルシステムによって異なるもの であり、必ずしもtime_tと一致するとは限りませんし、実際に試してみ るまでは表現可能な範囲かどうかも分からないわけです。ということで、 File.utimeだけを理由にTimeに制限を課する必要はないと思います。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦