summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/fileutils.gemspec6
-rw-r--r--lib/fileutils.rb66
-rw-r--r--test/fileutils/test_fileutils.rb22
3 files changed, 63 insertions, 31 deletions
diff --git a/lib/fileutils.gemspec b/lib/fileutils.gemspec
index 5e11587aab..a72b878810 100644
--- a/lib/fileutils.gemspec
+++ b/lib/fileutils.gemspec
@@ -1,14 +1,14 @@
# frozen_string_literal: true
+
Gem::Specification.new do |s|
s.name = "fileutils"
- s.version = '1.0.2'
- s.date = '2017-12-22'
+ s.version = '1.1.0'
s.summary = "Several file utility methods for copying, moving, removing, etc."
s.description = "Several file utility methods for copying, moving, removing, etc."
s.require_path = %w{lib}
s.files = [".gitignore", ".travis.yml", "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin/console", "bin/setup", "fileutils.gemspec", "lib/fileutils.rb"]
- s.required_ruby_version = ">= 2.4.0"
+ s.required_ruby_version = ">= 2.3.0"
s.authors = ["Minero Aoki"]
s.email = [nil]
diff --git a/lib/fileutils.rb b/lib/fileutils.rb
index 88e28f29d5..7cbc6f46fa 100644
--- a/lib/fileutils.rb
+++ b/lib/fileutils.rb
@@ -85,9 +85,11 @@
# <tt>:verbose</tt> flags to methods in FileUtils.
#
+require 'rbconfig'
+
module FileUtils
- VERSION = "1.0.2"
+ VERSION = "1.1.0"
def self.private_module_function(name) #:nodoc:
module_function name
@@ -119,8 +121,9 @@ module FileUtils
#
def cd(dir, verbose: nil, &block) # :yield: dir
fu_output_message "cd #{dir}" if verbose
- Dir.chdir(dir, &block)
+ result = Dir.chdir(dir, &block)
fu_output_message 'cd -' if verbose and block
+ result
end
module_function :cd
@@ -541,7 +544,7 @@ module FileUtils
module_function :move
def rename_cannot_overwrite_file? #:nodoc:
- /emx/ =~ RUBY_PLATFORM
+ /emx/ =~ RbConfig::CONFIG['host_os']
end
private_module_function :rename_cannot_overwrite_file?
@@ -681,22 +684,38 @@ module FileUtils
unless parent_st.sticky?
raise ArgumentError, "parent directory is world writable, FileUtils#remove_entry_secure does not work; abort: #{path.inspect} (parent directory mode #{'%o' % parent_st.mode})"
end
+
# freeze tree root
euid = Process.euid
- File.open(fullpath + '/.') {|f|
- unless fu_stat_identical_entry?(st, f.stat)
- # symlink (TOC-to-TOU attack?)
- File.unlink fullpath
- return
- end
- f.chown euid, -1
- f.chmod 0700
- unless fu_stat_identical_entry?(st, File.lstat(fullpath))
- # TOC-to-TOU attack?
- File.unlink fullpath
- return
- end
- }
+ dot_file = fullpath + "/."
+ begin
+ File.open(dot_file) {|f|
+ unless fu_stat_identical_entry?(st, f.stat)
+ # symlink (TOC-to-TOU attack?)
+ File.unlink fullpath
+ return
+ end
+ f.chown euid, -1
+ f.chmod 0700
+ }
+ rescue EISDIR # JRuby in non-native mode can't open files as dirs
+ File.lstat(dot_file).tap {|fstat|
+ unless fu_stat_identical_entry?(st, fstat)
+ # symlink (TOC-to-TOU attack?)
+ File.unlink fullpath
+ return
+ end
+ File.chown euid, -1, dot_file
+ File.chmod 0700, dot_file
+ }
+ end
+
+ unless fu_stat_identical_entry?(st, File.lstat(fullpath))
+ # TOC-to-TOU attack?
+ File.unlink fullpath
+ return
+ end
+
# ---- tree root is frozen ----
root = Entry_.new(path)
root.preorder_traverse do |ent|
@@ -797,8 +816,15 @@ module FileUtils
#
def compare_stream(a, b)
bsize = fu_stream_blksize(a, b)
- sa = String.new(capacity: bsize)
- sb = String.new(capacity: bsize)
+
+ if RUBY_VERSION > "2.4"
+ sa = String.new(capacity: bsize)
+ sb = String.new(capacity: bsize)
+ else
+ sa = String.new
+ sb = String.new
+ end
+
begin
a.read(bsize, sa)
b.read(bsize, sb)
@@ -1123,7 +1149,7 @@ module FileUtils
private
def fu_windows?
- /mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM
+ /mswin|mingw|bccwin|emx/ =~ RbConfig::CONFIG['host_os']
end
def fu_copy_stream0(src, dest, blksize = nil) #:nodoc:
diff --git a/test/fileutils/test_fileutils.rb b/test/fileutils/test_fileutils.rb
index c531af1569..f2600005f5 100644
--- a/test/fileutils/test_fileutils.rb
+++ b/test/fileutils/test_fileutils.rb
@@ -233,7 +233,7 @@ class TestFileUtils < Test::Unit::TestCase
def test_assert_output_lines
assert_raise(MiniTest::Assertion) {
- Timeout.timeout(0.1) {
+ Timeout.timeout(0.5) {
assert_output_lines([]) {
Thread.current.report_on_exception = false
raise "ok"
@@ -834,13 +834,15 @@ class TestFileUtils < Test::Unit::TestCase
check_singleton :ln_s
TARGETS.each do |fname|
- fname = "../#{fname}"
- lnfname = 'tmp/lnsdest'
- ln_s fname, lnfname
- assert FileTest.symlink?(lnfname), 'not symlink'
- assert_equal fname, File.readlink(lnfname)
- ensure
- rm_f lnfname
+ begin
+ fname = "../#{fname}"
+ lnfname = 'tmp/lnsdest'
+ ln_s fname, lnfname
+ assert FileTest.symlink?(lnfname), 'not symlink'
+ assert_equal fname, File.readlink(lnfname)
+ ensure
+ rm_f lnfname
+ end
end
end if have_symlink? and !no_broken_symlink?
@@ -1613,6 +1615,10 @@ class TestFileUtils < Test::Unit::TestCase
check_singleton :cd
end
+ def test_cd_result
+ assert_equal 42, cd('.') { 42 }
+ end
+
def test_chdir
check_singleton :chdir
end