なかだです。

At Sun, 9 Feb 2003 07:04:02 +0900,
Minero Aoki wrote:
> ついでと言ってはなんですが、FileUtils.pwd, cmp, identical?,
> uptodate? をオプションなしにしました。

cmp, copy_file, uptodate?あたりでファイル名以外(具体的にはIO,
Timeとか)を受け付けるようにするってのは、FileUtilsの主旨からは
外れてるでしょうか。これがあるとmkmf.rbからfileutils.rbを使うの
に都合がいいんですが。


Index: fileutils.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/fileutils.rb,v retrieving revision 1.12 diff -u -2 -p -r1.12 fileutils.rb --- fileutils.rb 8 Feb 2003 22:01:53 -0000 1.12 +++ fileutils.rb 9 Feb 2003 10:11:58 -0000 @@ -97,5 +97,5 @@ module FileUtils # - # Options: (none) + # Options: mtime # # Returns true if +newer+ is newer than all +old_list+. @@ -103,14 +103,26 @@ module FileUtils # # FileUtils.uptodate? 'hello.o', %w(hello.c hello.h) or system 'make' + # FileUtils.uptodate? 'hello.o', 'hello.c', :mtime or system 'make' # def uptodate?( new, old_list, *options ) - raise ArgumentError, 'uptodate? does not accept any option' unless options.empty? + time, = fu_parseargs(options, :mtime)[0] ? :mtime : :ctime - return false unless FileTest.exist? new - new_time = File.ctime(new) + unless Time === new + return false unless FileTest.exist? new + new = File.__send__(time, new) + end old_list.each do |old| - if FileTest.exist? old - return false unless new_time > File.mtime(old) + begin + old = Time.at(old) + rescue TypeError + if old.respond_to?(time) + old = old.__send__(time) + elsif FileTest.exist?(old) + old = File.__send__(time, old) + else + next + end end + return false unless new > old end true @@ -382,14 +394,27 @@ module FileUtils def copy_file( src, dest ) #:nodoc: - bsize = fu_blksize(File.stat(src).blksize) - File.open(src, 'rb') {|r| - File.open(dest, 'wb') {|w| - begin - while true - w.syswrite r.sysread(bsize) - end - rescue EOFError - end - } } + if (r = src).respond_to?(:sysread) + r.pos += 0 + else + r = File.open(src, 'rb') + end + if (w = dest).respond_to?(:syswrite) + w.pos += 0 + else + w = File.open(dest, 'wb') + end + bsize = fu_blksize(case + when r.respond_to?(:stat) + r.stat.blksize + when w.respond_to?(:stat) + w.stat.blksize + end) + while true do + w.syswrite r.sysread(bsize) + end + rescue EOFError + ensure + w == dest or w.close if w + r == src or r.close end @@ -569,26 +594,40 @@ module FileUtils sa = sb = nil - st = File.stat(filea) - bsize = fu_blksize(st.blksize) - return false unless File.size(fileb) == st.size - - File.open(filea, 'rb') {|a| - File.open(fileb, 'rb') {|b| - begin - while sa == sb - sa = a.read(bsize) - sb = b.read(bsize) - unless sa and sb - if sa.nil? and sb.nil? - return true - end - end - end - rescue EOFError - ; - end - } } + if (a = filea).respond_to?(:read) + a.pos += 0 + else + a = File.open(filea, 'rb') + end + if (b = fileb).respond_to?(:read) + b.pos += 0 + else + b = File.open(fileb, 'rb') + end + if a.respond_to?(:stat) + st = a.stat + sa = st.size + bsize = fu_blksize(st.blksize) + else + sa = a.size + end + if b.respond_to?(:stat) + st = b.stat + sb = st.size + bsize ||= fu_blksize(st.blksize) + else + sb = b.size + end + bsize ||= fu_blksize(nil) + return false unless sa == sb - false + begin + sa = a.read(bsize) + sb = b.read(bsize) + return false unless sa == sb + end while sa + not sb + ensure + a == filea or a.close if a + b == fileb or b.close end @@ -755,5 +794,5 @@ module FileUtils 'symlink' => %w( force noop verbose ), 'touch' => %w( noop verbose ), - 'uptodate?' => %w() + 'uptodate?' => %w( mtime ) }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦