From 6f9609867cdd4bf965465d0aabe0e8e6c665e9c0 Mon Sep 17 00:00:00 2001 From: hsbt Date: Tue, 15 May 2018 01:22:36 +0000 Subject: Merge fileutils-1.1.0. This version was migrated JRuby paches. https://github.com/ruby/fileutils/pull/18 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63425 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/fileutils.gemspec | 6 ++-- lib/fileutils.rb | 66 ++++++++++++++++++++++++++++------------ test/fileutils/test_fileutils.rb | 22 +++++++++----- 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 @@ # :verbose 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 -- cgit v1.2.3