[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]