ruby-changes:27492
From: drbrain <ko1@a...>
Date: Fri, 1 Mar 2013 11:09:54 +0900 (JST)
Subject: [ruby-changes:27492] drbrain:r39544 (trunk): * lib/fileutils.rb: Revert r34669 which altered the way
drbrain 2013-03-01 11:09:42 +0900 (Fri, 01 Mar 2013) New Revision: 39544 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39544 Log: * lib/fileutils.rb: Revert r34669 which altered the way metaprogramming in FileUtils occurred. [ruby-trunk - Bug #7958] * test/fileutils/visibility_tests.rb: Refactored tests of FileUtils options modules to expose bug found in #7958 * test/fileutils/test_dryrun.rb: ditto. * test/fileutils/test_nowrite.rb: ditto. * test/fileutils/test_verbose.rb: ditto. Added files: trunk/test/fileutils/visibility_tests.rb Modified files: trunk/ChangeLog trunk/lib/fileutils.rb trunk/test/fileutils/test_dryrun.rb trunk/test/fileutils/test_nowrite.rb trunk/test/fileutils/test_verbose.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 39543) +++ ChangeLog (revision 39544) @@ -1,3 +1,14 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Fri Mar 1 11:09:06 2013 Eric Hodel <drbrain@s...> + + * lib/fileutils.rb: Revert r34669 which altered the way + metaprogramming in FileUtils occurred. [ruby-trunk - Bug #7958] + + * test/fileutils/visibility_tests.rb: Refactored tests of FileUtils + options modules to expose bug found in #7958 + * test/fileutils/test_dryrun.rb: ditto. + * test/fileutils/test_nowrite.rb: ditto. + * test/fileutils/test_verbose.rb: ditto. + Fri Mar 1 09:18:00 2013 Zachary Scott <zachary@z...> * lib/psych.rb: specify in rdoc what object is returned in parser Index: lib/fileutils.rb =================================================================== --- lib/fileutils.rb (revision 39543) +++ lib/fileutils.rb (revision 39544) @@ -83,96 +83,16 @@ https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L83 # module FileUtils - @fileutils_output = $stderr - @fileutils_label = '' - extend self - # - # This module has all methods of FileUtils module, but it outputs messages - # before acting. This equates to passing the <tt>:verbose</tt> flag to - # methods in FileUtils. - # - module Verbose - include FileUtils - @fileutils_output = $stderr - @fileutils_label = '' - extend self - end - - # - # This module has all methods of FileUtils module, but never changes - # files/directories. This equates to passing the <tt>:noop</tt> flag - # to methods in FileUtils. - # - module NoWrite - include FileUtils - @fileutils_output = $stderr - @fileutils_label = '' - extend self - end - - # - # This module has all methods of FileUtils module, but never changes - # files/directories, with printing message before acting. - # This equates to passing the <tt>:noop</tt> and <tt>:verbose</tt> flag - # to methods in FileUtils. - # - module DryRun - include FileUtils - @fileutils_output = $stderr - @fileutils_label = '' - extend self + def self.private_module_function(name) #:nodoc: + module_function name + private_class_method name end # This hash table holds command options. OPT_TABLE = {} #:nodoc: internal use only # - def self.define_command(name, *options) - OPT_TABLE[name.to_s] = options - - if options.include?(:verbose) - Verbose.module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*args) - super(*fu_update_option(args, :verbose => true)) - end - EOS - end - if options.include?(:noop) - NoWrite.module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*args) - super(*fu_update_option(args, :noop => true)) - end - EOS - DryRun.module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*args) - super(*fu_update_option(args, :noop => true, :verbose => true)) - end - EOS - else - NoWrite.module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*); end - EOS - DryRun.module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*); end - EOS - end - - [self, Verbose, DryRun, NoWrite].each do |mod| - mod.module_eval(<<-EOS, __FILE__, __LINE__ + 1) - private :#{name} - class << self; public :#{name}; end - EOS - end - end - - class << self - private :define_command - end - -public - - # # Options: (none) # # Returns the name of the current directory. @@ -180,11 +100,10 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L100 def pwd Dir.pwd end + module_function :pwd alias getwd pwd - - define_command('pwd') - define_command('getwd') + module_function :getwd # # Options: verbose @@ -206,11 +125,13 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L125 Dir.chdir(dir, &block) fu_output_message 'cd -' if options[:verbose] and block end + module_function :cd alias chdir cd + module_function :chdir - define_command('cd', :verbose) - define_command('chdir', :verbose) + OPT_TABLE['cd'] = + OPT_TABLE['chdir'] = [:verbose] # # Options: (none) @@ -231,8 +152,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L152 end true end - - define_command('uptodate?') + module_function :uptodate? # # Options: mode noop verbose @@ -254,8 +174,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L174 fu_mkdir dir, options[:mode] end end + module_function :mkdir - define_command('mkdir', :mode, :noop, :verbose) + OPT_TABLE['mkdir'] = [:mode, :noop, :verbose] # # Options: mode noop verbose @@ -304,15 +225,16 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L225 return *list end + module_function :mkdir_p alias mkpath mkdir_p alias makedirs mkdir_p + module_function :mkpath + module_function :makedirs - define_command('mkdir_p', :mode, :noop, :verbose) - define_command('mkpath', :mode, :noop, :verbose) - define_command('makedirs', :mode, :noop, :verbose) - -private + OPT_TABLE['mkdir_p'] = + OPT_TABLE['mkpath'] = + OPT_TABLE['makedirs'] = [:mode, :noop, :verbose] def fu_mkdir(path, mode) #:nodoc: path = path.chomp(?/) @@ -323,8 +245,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L245 Dir.mkdir path end end - -public + private_module_function :fu_mkdir # # Options: noop, verbose @@ -354,8 +275,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L275 end end end + module_function :rmdir - define_command('rmdir', :parents, :noop, :verbose) + OPT_TABLE['rmdir'] = [:parents, :noop, :verbose] # # Options: force noop verbose @@ -388,11 +310,13 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L310 File.link s, d end end + module_function :ln alias link ln + module_function :link - define_command('ln', :force, :noop, :verbose) - define_command('link', :force, :noop, :verbose) + OPT_TABLE['ln'] = + OPT_TABLE['link'] = [:force, :noop, :verbose] # # Options: force noop verbose @@ -425,11 +349,13 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L349 File.symlink s, d end end + module_function :ln_s alias symlink ln_s + module_function :symlink - define_command('ln_s', :force, :noop, :verbose) - define_command('symlink', :force, :noop, :verbose) + OPT_TABLE['ln_s'] = + OPT_TABLE['symlink'] = [:force, :noop, :verbose] # # Options: noop verbose @@ -443,8 +369,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L369 options[:force] = true ln_s src, dest, options end + module_function :ln_sf - define_command('ln_sf', :noop, :verbose) + OPT_TABLE['ln_sf'] = [:noop, :verbose] # # Options: preserve noop verbose @@ -467,11 +394,13 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L394 copy_file s, d, options[:preserve] end end + module_function :cp alias copy cp + module_function :copy - define_command('cp', :preserve, :noop, :verbose) - define_command('copy', :preserve, :noop, :verbose) + OPT_TABLE['cp'] = + OPT_TABLE['copy'] = [:preserve, :noop, :verbose] # # Options: preserve noop verbose dereference_root remove_destination @@ -506,8 +435,10 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L435 copy_entry s, d, options[:preserve], options[:dereference_root], options[:remove_destination] end end + module_function :cp_r - define_command('cp_r', :preserve, :noop, :verbose, :dereference_root, :remove_destination) + OPT_TABLE['cp_r'] = [:preserve, :noop, :verbose, + :dereference_root, :remove_destination] # # Copies a file system entry +src+ to +dest+. @@ -535,8 +466,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L466 ent.copy_metadata destent.path if preserve end) end - - define_command(:copy_entry) + module_function :copy_entry # # Copies file contents of +src+ to +dest+. @@ -547,8 +477,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L477 ent.copy_file dest ent.copy_metadata dest if preserve end - - define_command(:copy_file) + module_function :copy_file # # Copies stream +src+ to +dest+. @@ -558,8 +487,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L487 def copy_stream(src, dest) IO.copy_stream(src, dest) end - - define_command(:copy_stream) + module_function :copy_stream # # Options: force noop verbose @@ -602,19 +530,18 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L530 end end end + module_function :mv alias move mv + module_function :move - define_command('mv', :force, :noop, :verbose, :secure) - define_command('move', :force, :noop, :verbose, :secure) - -private + OPT_TABLE['mv'] = + OPT_TABLE['move'] = [:force, :noop, :verbose, :secure] def rename_cannot_overwrite_file? #:nodoc: /cygwin|mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM end - -public + private_module_function :rename_cannot_overwrite_file? # # Options: force noop verbose @@ -636,11 +563,13 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L563 remove_file path, options[:force] end end + module_function :rm alias remove rm + module_function :remove - define_command('rm', :force, :noop, :verbose) - define_command('remove', :force, :noop, :verbose) + OPT_TABLE['rm'] = + OPT_TABLE['remove'] = [:force, :noop, :verbose] # # Options: noop verbose @@ -655,11 +584,13 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L584 options[:force] = true rm list, options end + module_function :rm_f alias safe_unlink rm_f + module_function :safe_unlink - define_command('rm_f', :noop, :verbose) - define_command('safe_unlink', :noop, :verbose) + OPT_TABLE['rm_f'] = + OPT_TABLE['safe_unlink'] = [:noop, :verbose] # # Options: force noop verbose secure @@ -696,8 +627,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L627 end end end + module_function :rm_r - define_command('rm_r', :force, :noop, :verbose, :secure) + OPT_TABLE['rm_r'] = [:force, :noop, :verbose, :secure] # # Options: noop verbose secure @@ -715,11 +647,13 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L647 options[:force] = true rm_r list, options end + module_function :rm_rf alias rmtree rm_rf + module_function :rmtree - define_command('rm_rf', :noop, :verbose, :secure) - define_command('rmtree', :noop, :verbose, :secure) + OPT_TABLE['rm_rf'] = + OPT_TABLE['rmtree'] = [:noop, :verbose, :secure] # # This method removes a file system entry +path+. +path+ shall be a @@ -807,10 +741,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L741 rescue raise unless force end - - define_command(:remove_entry_secure) - -private + module_function :remove_entry_secure def fu_have_symlink? #:nodoc: File.symlink nil, nil @@ -819,12 +750,12 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L750 rescue TypeError return true end + private_module_function :fu_have_symlink? def fu_stat_identical_entry?(a, b) #:nodoc: a.dev == b.dev and a.ino == b.ino end - -public + private_module_function :fu_stat_identical_entry? # # This method removes a file system entry +path+. @@ -844,8 +775,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L775 rescue raise unless force end - - define_command(:remove_entry) + module_function :remove_entry # # Removes a file +path+. @@ -856,8 +786,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L786 rescue raise unless force end - - define_command(:remove_file) + module_function :remove_file # # Removes a directory +dir+ and its contents recursively. @@ -866,8 +795,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L795 def remove_dir(path, force = false) remove_entry path, force # FIXME?? check if it is a directory end - - define_command(:remove_dir) + module_function :remove_dir # # Returns true if the contents of a file A and a file B are identical. @@ -883,13 +811,12 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L811 } } end + module_function :compare_file alias identical? compare_file alias cmp compare_file - - define_command(:compare_file) - define_command(:identical?) - define_command(:cmp) + module_function :identical? + module_function :cmp # # Returns true if the contents of a stream +a+ and +b+ are identical. @@ -905,8 +832,7 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L832 end while sa == sb false end - - define_command(:compare_stream) + module_function :compare_stream # # Options: mode preserve noop verbose @@ -931,10 +857,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L857 end end end + module_function :install - define_command('install', :mode, :preserve, :noop, :verbose) - -private + OPT_TABLE['install'] = [:mode, :preserve, :noop, :verbose] def user_mask(target) #:nodoc: mask = 0 @@ -952,6 +877,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L877 end mask end + private_module_function :user_mask def mode_mask(mode, path) #:nodoc: mask = 0 @@ -973,6 +899,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L899 end mask end + private_module_function :mode_mask def symbolic_modes_to_i(modes, path) #:nodoc: current_mode = (File.stat(path).mode & 07777) @@ -993,17 +920,17 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L920 end end end + private_module_function :symbolic_modes_to_i def fu_mode(mode, path) #:nodoc: mode.is_a?(String) ? symbolic_modes_to_i(mode, path) : mode end + private_module_function :fu_mode def mode_to_s(mode) #:nodoc: mode.is_a?(String) ? mode : "%o" % mode end -public - # # Options: noop verbose # @@ -1046,8 +973,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L973 Entry_.new(path).chmod(fu_mode(mode, path)) end end + module_function :chmod - define_command('chmod', :noop, :verbose) + OPT_TABLE['chmod'] = [:noop, :verbose] # # Options: noop verbose force @@ -1075,8 +1003,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1003 end end end + module_function :chmod_R - define_command('chmod_R', :noop, :verbose, :force) + OPT_TABLE['chmod_R'] = [:noop, :verbose, :force] # # Options: noop verbose @@ -1103,8 +1032,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1032 Entry_.new(path).chown uid, gid end end + module_function :chown - define_command('chown', :noop, :verbose) + OPT_TABLE['chown'] = [:noop, :verbose] # # Options: noop verbose force @@ -1139,10 +1069,9 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1069 end end end + module_function :chown_R - define_command('chown_R', :noop, :verbose, :force) - -private + OPT_TABLE['chown_R'] = [:noop, :verbose, :force] begin require 'etc' @@ -1158,6 +1087,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1087 Etc.getpwnam(user).uid end end + private_module_function :fu_get_uid def fu_get_gid(group) #:nodoc: return nil unless group @@ -1170,6 +1100,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1100 Etc.getgrnam(group).gid end end + private_module_function :fu_get_gid rescue LoadError # need Win32 support??? @@ -1177,14 +1108,14 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1108 def fu_get_uid(user) #:nodoc: user # FIXME end + private_module_function :fu_get_uid def fu_get_gid(group) #:nodoc: group # FIXME end + private_module_function :fu_get_gid end -public - # # Options: noop verbose # @@ -1217,10 +1148,11 @@ public https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1148 end end end + module_function :touch - define_command('touch', :noop, :verbose, :mtime, :nocreate) + OPT_TABLE['touch'] = [:noop, :verbose, :mtime, :nocreate] -private + private module StreamUtils_ private @@ -1552,7 +1484,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1484 post.call self end - private + private $fileutils_rb_have_lchmod = nil @@ -1608,11 +1540,10 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1540 end end # class Entry_ -private - def fu_list(arg) #:nodoc: [arg].flatten.map {|path| File.path(path) } end + private_module_function :fu_list def fu_each_src_dest(src, dest) #:nodoc: fu_each_src_dest0(src, dest) do |s, d| @@ -1620,6 +1551,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1551 yield s, d, File.stat(s) end end + private_module_function :fu_each_src_dest def fu_each_src_dest0(src, dest) #:nodoc: if tmp = Array.try_convert(src) @@ -1636,10 +1568,12 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1568 end end end + private_module_function :fu_each_src_dest0 def fu_same?(a, b) #:nodoc: File.identical?(a, b) end + private_module_function :fu_same? def fu_check_options(options, optdecl) #:nodoc: h = options.dup @@ -1648,6 +1582,7 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1582 end raise ArgumentError, "no such option: #{h.keys.join(' ')}" unless h.empty? end + private_module_function :fu_check_options def fu_update_option(args, new) #:nodoc: if tmp = Hash.try_convert(args.last) @@ -1657,12 +1592,17 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1592 end args end + private_module_function :fu_update_option + + @fileutils_output = $stderr + @fileutils_label = '' def fu_output_message(msg) #:nodoc: @fileutils_output ||= $stderr @fileutils_label ||= '' @fileutils_output.puts @fileutils_label + msg end + private_module_function :fu_output_message # # Returns an Array of method names which have any options. @@ -1712,27 +1652,91 @@ private https://github.com/ruby/ruby/blob/trunk/lib/fileutils.rb#L1652 OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) } end - # LOW_METHODS + LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern) + module LowMethods + module_eval("private\n" + ::FileUtils::LOW_METHODS.map {|name| "def #{name}(*)end"}.join("\n"), + __FILE__, __LINE__) + end + + METHODS = singleton_methods() - [:private_module_function, + :commands, :options, :have_option?, :options_of, :collect_method] + # - # :pwd, :getwd, :cd, :chdir, - # :uptodate?, :copy_entry, :copy_file, :copy_stream, :remove_entry_secure, - # :remove_entry, :remove_file, :remove_dir, :compare_file, :identical?, - # :cmp, :compare_stream + # This module has all methods of FileUtils module, but it outputs messages + # before acting. This equates to passing the <tt>:verbose</tt> flag to + # methods in FileUt (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/