From: "trans (Thomas Sawyer)" <transfire@...>
Date: 2013-02-26T21:50:06+09:00
Subject: [ruby-core:52940] [ruby-trunk - Bug #7958] include FileUtils::Verbose gives NoMethodError when installing files with a different mode


Issue #7958 has been updated by trans (Thomas Sawyer).


=begin
It's b/c of Module Inclusion Problem. StreamUtils_ is included into FileUtils and FileUtils is included in FileUtils::Verbose. So one would expect it to work, but b/c the later include is done first, StreamUtils_ only actually makes it as far as FileUtils.

The simplest solution is probably to move lines 90-125 from the top of the file to the bottom. But that's unfortunate b/c it would make the code less readable. 

Eric's patch can work but it might need to add `extend StreamUtils_` as well, in order to fully work.

Taking a moment to think about this more in depth, it becomes clear this will be a problem if anyone ever wants to extend FileUtils with some other module (for whatever reason). So perhaps a more robust solution would be to work around the module include problem altogether with an included callback, e.g.

    module FileUtils
      def self.included(mod)
        Verbose.send(:include, mod)
        NoWrite.send(:include, mod)
        DryRun.send(:include, mod)

        # re-extend self
        extend self
        Verbose.send(:extend, Verbose)
        NoWrite.send(:extend, NoWrite)
        DryRun.send(:extend, DryRun)
      end
    end

See any problems with that approach?
=end

----------------------------------------
Bug #7958: include FileUtils::Verbose gives NoMethodError when installing files with a different mode
https://bugs.ruby-lang.org/issues/7958#change-37099

Author: drbrain (Eric Hodel)
Status: Open
Priority: Normal
Assignee: nobu (Nobuyoshi Nakada)
Category: lib
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-02-26 trunk 39490) [x86_64-darwin12.2.1]


=begin
Seems like (({fu_stream_blksize})) isn't included when (({FileUtils::Verbose})) is.  Changing to plain FileUtils works, though.

  $ cat test.rb 
  require 'fileutils'
  require 'tmpdir'
  
  include FileUtils::Verbose
  
  Dir.mktmpdir 'test' do |dir|
    install __FILE__, dir, mode: 0600
    install __FILE__, dir, mode: 0640
  end
  
  $ ~/.rubies/trunk/bin/ruby -v test.rb 
  ruby 2.1.0dev (2013-02-26 trunk 39490) [x86_64-darwin12.2.1]
  install -c -m 0600 test.rb /var/folders/87/twjsm89x01161gp5d9qwlx2m0000gn/T/test20130225-53176-197q6me
  install -c -m 0640 test.rb /var/folders/87/twjsm89x01161gp5d9qwlx2m0000gn/T/test20130225-53176-197q6me
  /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:898:in `compare_stream': undefined method `fu_stream_blksize' for main:Object (NoMethodError)
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:882:in `block (2 levels) in compare_file'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:881:in `open'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:881:in `block in compare_file'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:880:in `open'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:880:in `compare_file'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:926:in `block in install'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:1620:in `block in fu_each_src_dest'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:1633:in `fu_each_src_dest0'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:1618:in `fu_each_src_dest'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:925:in `install'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/fileutils.rb:137:in `install'
  	from test.rb:8:in `block in <main>'
  	from /Users/drbrain/.rubies/trunk/lib/ruby/2.1.0/tmpdir.rb:88:in `mktmpdir'
  	from test.rb:6:in `<main>'
=end



-- 
http://bugs.ruby-lang.org/