mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/fileutils.rb (copy_stream): use read/write instead of sysread/syswrite, which allows duck typing. [ruby-dev:25369]
* lib/fileutils.rb (copy_stream): does NOT support nonblocking IO. [ruby-dev:25370] * test/fileutils/test_fileutils.rb: test copy_entry, copy_file, copy_stream. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7699 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
41257b6d93
commit
0a4a9dbaea
3 changed files with 136 additions and 42 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
Sat Jan 1 16:21:29 2005 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* lib/fileutils.rb (copy_stream): use read/write instead of
|
||||
sysread/syswrite, which allows duck typing. [ruby-dev:25369]
|
||||
|
||||
* lib/fileutils.rb (copy_stream): does NOT support nonblocking IO.
|
||||
[ruby-dev:25370]
|
||||
|
||||
* test/fileutils/test_fileutils.rb: test copy_entry, copy_file,
|
||||
copy_stream.
|
||||
|
||||
Sat Jan 1 04:20:23 2005 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
||||
|
||||
* ext/openssl/ossl_ns_spki.c (ossl_spki_set_challenge): should call
|
||||
|
|
|
@ -47,12 +47,14 @@
|
|||
#
|
||||
# There are some `low level' methods, which does not accept any option:
|
||||
#
|
||||
# uptodate?(file, cmp_list)
|
||||
# copy_entry(src, dest, preserve = false, dereference = false)
|
||||
# copy_file(src, dest, preserve = false, dereference = true)
|
||||
# copy_stream(srcstream, deststream)
|
||||
# remove_file(path, force = false)
|
||||
# remove_dir(path, force = false)
|
||||
# compare_file(path_a, path_b)
|
||||
# compare_stream(stream_a, stream_b)
|
||||
# uptodate?(file, cmp_list)
|
||||
#
|
||||
# == module FileUtils::Verbose
|
||||
#
|
||||
|
@ -434,18 +436,16 @@ module FileUtils
|
|||
|
||||
#
|
||||
# Copies stream +src+ to +dest+.
|
||||
# Both of +src+ and +dest+ must be a IO.
|
||||
# +src+ must be respond to #read(n) and
|
||||
# +dest+ must be respond to #write(str).
|
||||
#
|
||||
def copy_stream(src, dest)
|
||||
fu_copy_stream0 src, dest, fu_stream_blksize(src, dest)
|
||||
end
|
||||
|
||||
def fu_copy_stream0(src, dest, blksize) #:nodoc:
|
||||
begin
|
||||
while true
|
||||
dest.syswrite src.sysread(blksize)
|
||||
end
|
||||
rescue EOFError
|
||||
while s = src.read(blksize)
|
||||
dest.write s
|
||||
end
|
||||
end
|
||||
private :fu_copy_stream0
|
||||
|
@ -530,7 +530,11 @@ module FileUtils
|
|||
end
|
||||
|
||||
def stat(path)
|
||||
@stat ||= ::File.stat(path)
|
||||
if @dereference
|
||||
@stat ||= ::File.stat(path)
|
||||
else
|
||||
@stat ||= ::File.lstat(path)
|
||||
end
|
||||
end
|
||||
|
||||
def chmod(mode, path)
|
||||
|
|
|
@ -141,6 +141,16 @@ class TestFileUtils
|
|||
File.utime t-4, t-4, 'data/newer'
|
||||
end
|
||||
|
||||
def each_sample_file
|
||||
TARGETS.each do |srcpath|
|
||||
yield srcpath, "tmp/#{File.basename(srcpath)}"
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Test Cases
|
||||
#
|
||||
|
||||
def test_pwd
|
||||
assert_equal Dir.pwd, pwd()
|
||||
|
||||
|
@ -176,24 +186,19 @@ end
|
|||
end
|
||||
|
||||
def test_cp
|
||||
TARGETS.each do |fname|
|
||||
cp fname, 'tmp/cp'
|
||||
assert_same_file fname, 'tmp/cp'
|
||||
each_sample_file do |srcpath, destpath|
|
||||
cp srcpath, destpath
|
||||
assert_same_file srcpath, destpath
|
||||
|
||||
cp fname, 'tmp'
|
||||
assert_same_file fname, 'tmp/' + File.basename(fname)
|
||||
cp srcpath, File.dirname(destpath)
|
||||
assert_same_file srcpath, destpath
|
||||
|
||||
cp fname, 'tmp/'
|
||||
assert_same_file fname, 'tmp/' + File.basename(fname)
|
||||
cp srcpath, File.dirname(destpath) + '/'
|
||||
assert_same_file srcpath, destpath
|
||||
|
||||
cp fname, 'tmp/preserve', :preserve => true
|
||||
assert_same_file fname, 'tmp/preserve'
|
||||
a = File.stat(fname)
|
||||
b = File.stat('tmp/preserve')
|
||||
assert_equal a.mode, b.mode
|
||||
assert_equal a.mtime, b.mtime
|
||||
assert_equal a.uid, b.uid
|
||||
assert_equal a.gid, b.gid
|
||||
cp srcpath, destpath, :preserve => true
|
||||
assert_same_file srcpath, destpath
|
||||
assert_same_entry srcpath, destpath
|
||||
end
|
||||
|
||||
# src==dest (1) same path
|
||||
|
@ -673,25 +678,6 @@ end
|
|||
}
|
||||
end
|
||||
|
||||
def test_uptodate?
|
||||
Dir.chdir('data') {
|
||||
assert( uptodate?('newest', %w(old newer notexist)) )
|
||||
assert( ! uptodate?('newer', %w(old newest notexist)) )
|
||||
assert( ! uptodate?('notexist', %w(old newest newer)) )
|
||||
}
|
||||
|
||||
# pathname
|
||||
touch 'tmp/a'
|
||||
touch 'tmp/b'
|
||||
touch 'tmp/c'
|
||||
assert_nothing_raised {
|
||||
uptodate? Pathname.new('tmp/a'), ['tmp/b', 'tmp/c']
|
||||
uptodate? 'tmp/a', [Pathname.new('tmp/b'), 'tmp/c']
|
||||
uptodate? 'tmp/a', ['tmp/b', Pathname.new('tmp/c')]
|
||||
uptodate? Pathname.new('tmp/a'), [Pathname.new('tmp/b'), Pathname.new('tmp/c')]
|
||||
}
|
||||
end
|
||||
|
||||
def test_install
|
||||
File.open('tmp/aaa', 'w') {|f| f.puts 'aaa' }
|
||||
File.open('tmp/bbb', 'w') {|f| f.puts 'bbb' }
|
||||
|
@ -761,4 +747,97 @@ end
|
|||
# FIXME
|
||||
end
|
||||
|
||||
def test_copy_entry
|
||||
each_sample_file do |srcpath, destpath|
|
||||
copy_entry srcpath, destpath
|
||||
assert_same_file srcpath, destpath
|
||||
assert_same_entry srcpath, destpath
|
||||
end
|
||||
if have_symlink?
|
||||
File.symlink 'somewhere', 'tmp/symsrc'
|
||||
copy_entry 'tmp/symsrc', 'tmp/symdest'
|
||||
assert_equal File.lstat('tmp/symsrc').mode, File.lstat('tmp/symdest').mode
|
||||
end
|
||||
end
|
||||
|
||||
def test_copy_file
|
||||
each_sample_file do |srcpath, destpath|
|
||||
copy_file srcpath, destpath
|
||||
assert_same_file srcpath, destpath
|
||||
end
|
||||
end
|
||||
|
||||
def test_copy_stream
|
||||
# IO
|
||||
each_sample_file do |srcpath, destpath|
|
||||
File.open(srcpath) {|src|
|
||||
File.open(destpath, 'w') {|dest|
|
||||
copy_stream src, dest
|
||||
}
|
||||
}
|
||||
assert_same_file srcpath, destpath
|
||||
end
|
||||
|
||||
# duck typing test [ruby-dev:25369]
|
||||
rm_rf 'tmp'
|
||||
Dir.mkdir 'tmp'
|
||||
each_sample_file do |srcpath, destpath|
|
||||
File.open(srcpath) {|src|
|
||||
File.open(destpath, 'w') {|dest|
|
||||
copy_stream Stream.new(src), Stream.new(dest)
|
||||
}
|
||||
}
|
||||
assert_same_file srcpath, destpath
|
||||
end
|
||||
end
|
||||
|
||||
def test_remove_file
|
||||
# FIXME
|
||||
end
|
||||
|
||||
def test_remove_dir
|
||||
# FIXME
|
||||
end
|
||||
|
||||
def test_compare_file
|
||||
# FIXME
|
||||
end
|
||||
|
||||
def test_compare_stream
|
||||
# FIXME
|
||||
end
|
||||
|
||||
class Stream
|
||||
def initialize(f)
|
||||
@f = f
|
||||
end
|
||||
|
||||
def read(n)
|
||||
@f.read(n)
|
||||
end
|
||||
|
||||
def write(str)
|
||||
@f.write str
|
||||
end
|
||||
end
|
||||
|
||||
def test_uptodate?
|
||||
Dir.chdir('data') {
|
||||
assert( uptodate?('newest', %w(old newer notexist)) )
|
||||
assert( ! uptodate?('newer', %w(old newest notexist)) )
|
||||
assert( ! uptodate?('notexist', %w(old newest newer)) )
|
||||
}
|
||||
|
||||
# pathname
|
||||
touch 'tmp/a'
|
||||
touch 'tmp/b'
|
||||
touch 'tmp/c'
|
||||
assert_nothing_raised {
|
||||
uptodate? Pathname.new('tmp/a'), ['tmp/b', 'tmp/c']
|
||||
uptodate? 'tmp/a', [Pathname.new('tmp/b'), 'tmp/c']
|
||||
uptodate? 'tmp/a', ['tmp/b', Pathname.new('tmp/c')]
|
||||
uptodate? Pathname.new('tmp/a'), [Pathname.new('tmp/b'), Pathname.new('tmp/c')]
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue