summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2020-05-19 12:08:43 +0200
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2020-06-05 07:32:42 +0900
commit8e5fe13c089717c9516b1a7eb0fe22d0fbe7b25f (patch)
treee7a02f79512ebd849fb4e3d24e1d33f2d8ee6863
parent3660d14de60ac4a2b420601db5b16c104a0c7858 (diff)
[rubygems/rubygems] Delay `fileutils` loading to fix some warnings
If the following conditions are met: * You have a default version of fileutils and a higher version of fileutils installed as a regular gem. This case is common on ruby 2.6. * You use a bundler generated binstub on a gem setup with a `Gemfile` using the `gemspec` DSL. Then `fileutils` redefinition warnings happen because of the following: The gist of a bundler generated binstub is: ```ruby require "bundler/setup" load Gem.bin_path("rake", "rake") ``` First configure bundler, then load the requested gem. When `require "bundler/setup"` is called under the previously mentioned setup, `ext_conf_builder.rb` ends up being required because of the new validation that gemspecs with rake extensions depend on `rake`. And that loads the latest version of `fileutils` because of using "rubygems monkeypatched require" that auto-chooses the latest version of default gems. After that, when `Gem.bin_path` gets called, `ext_conf_builder.rb` gets required again, but this time already using "bundler's unmonkeypatched require" which means the default version is chosen and thus the redefinition warning happens. The solution as usual is to lazily load `fileutils`. https://github.com/rubygems/rubygems/commit/08d64e5f06
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3184
-rw-r--r--lib/rubygems/ext/ext_conf_builder.rb9
1 files changed, 4 insertions, 5 deletions
diff --git a/lib/rubygems/ext/ext_conf_builder.rb b/lib/rubygems/ext/ext_conf_builder.rb
index d06e923a30..1fe1ea895d 100644
--- a/lib/rubygems/ext/ext_conf_builder.rb
+++ b/lib/rubygems/ext/ext_conf_builder.rb
@@ -5,15 +5,14 @@
# See LICENSE.txt for permissions.
#++
-require 'fileutils'
-require 'tempfile'
require 'shellwords'
class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
- FileEntry = FileUtils::Entry_ # :nodoc:
-
def self.build(extension, dest_path, results, args=[], lib_dir=nil)
+ require 'fileutils'
+ require 'tempfile'
+
tmp_dest = Dir.mktmpdir(".gem.", ".")
# Some versions of `mktmpdir` return absolute paths, which will break make
@@ -71,7 +70,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
FileUtils.cp_r entries, lib_dir, :remove_destination => true
end
- FileEntry.new(tmp_dest).traverse do |ent|
+ FileUtils::Entry_.new(tmp_dest).traverse do |ent|
destent = ent.class.new(dest_path, ent.rel)
destent.exist? or FileUtils.mv(ent.path, destent.path)
end