ruby-changes:57980
From: Jeremy <ko1@a...>
Date: Fri, 27 Sep 2019 13:42:57 +0900 (JST)
Subject: [ruby-changes:57980] 9494ef8b2d (master): [ruby/fileutils] Do not break in verbose mode if using FileUtils with a frozen object
https://git.ruby-lang.org/ruby.git/commit/?id=9494ef8b2d From 9494ef8b2de3a7224eb85800606e7c046964cbd2 Mon Sep 17 00:00:00 2001 From: Jeremy Evans <code@j...> Date: Wed, 31 Jul 2019 12:57:21 -0700 Subject: [ruby/fileutils] Do not break in verbose mode if using FileUtils with a frozen object If FileUtils is included into another object, and verbose mode is used, a FrozenError is currently raised unless the object has the @fileutils_output and @fileutils_label instance variables. This fixes things so that it does not attempt to set the instance variables, but it still uses them if they are present. https://github.com/ruby/fileutils/commit/689cb9c56a diff --git a/lib/fileutils.rb b/lib/fileutils.rb index bc4fd70..3c23ffc 100644 --- a/lib/fileutils.rb +++ b/lib/fileutils.rb @@ -1608,13 +1608,13 @@ module FileUtils https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1608 end private_module_function :fu_same? - @fileutils_output = $stderr - @fileutils_label = '' - def fu_output_message(msg) #:nodoc: - @fileutils_output ||= $stderr - @fileutils_label ||= '' - @fileutils_output.puts @fileutils_label + msg + output = @fileutils_output if defined?(@fileutils_output) + output ||= $stderr + if defined?(@fileutils_label) + msg = @fileutils_label + msg + end + output.puts msg end private_module_function :fu_output_message @@ -1695,8 +1695,6 @@ module FileUtils https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1695 # module Verbose include FileUtils - @fileutils_output = $stderr - @fileutils_label = '' names = ::FileUtils.collect_method(:verbose) names.each do |name| module_eval(<<-EOS, __FILE__, __LINE__ + 1) @@ -1720,8 +1718,6 @@ module FileUtils https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1718 module NoWrite include FileUtils include LowMethods - @fileutils_output = $stderr - @fileutils_label = '' names = ::FileUtils.collect_method(:noop) names.each do |name| module_eval(<<-EOS, __FILE__, __LINE__ + 1) @@ -1746,8 +1742,6 @@ module FileUtils https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1742 module DryRun include FileUtils include LowMethods - @fileutils_output = $stderr - @fileutils_label = '' names = ::FileUtils.collect_method(:noop) names.each do |name| module_eval(<<-EOS, __FILE__, __LINE__ + 1) diff --git a/test/fileutils/test_fileutils.rb b/test/fileutils/test_fileutils.rb index 4480c27..41100e1 100644 --- a/test/fileutils/test_fileutils.rb +++ b/test/fileutils/test_fileutils.rb @@ -6,6 +6,7 @@ require 'etc' https://github.com/ruby/ruby/blob/trunk/test/fileutils/test_fileutils.rb#L6 require_relative 'fileasserts' require 'pathname' require 'tmpdir' +require 'stringio' require 'test/unit' class TestFileUtils < Test::Unit::TestCase @@ -1673,6 +1674,29 @@ class TestFileUtils < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/fileutils/test_fileutils.rb#L1674 check_singleton :chdir end + def test_chdir_verbose + assert_output_lines(["cd .", "cd -"], FileUtils) do + FileUtils.chdir('.', verbose: true){} + end + end + + def test_chdir_verbose_frozen + o = Object.new + o.extend(FileUtils) + o.singleton_class.send(:public, :chdir) + o.freeze + orig_stderr = $stderr + $stderr = StringIO.new + o.chdir('.', verbose: true){} + $stderr.rewind + assert_equal(<<-END, $stderr.read) +cd . +cd - + END + ensure + $stderr = orig_stderr if orig_stderr + end + def test_getwd check_singleton :getwd end -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/