diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb new file mode 100644 index 00000000000000..82f35a745e209b --- /dev/null +++ b/lib/bundled_gems.rb @@ -0,0 +1,23 @@ +module Gem + BUNDLED_GEMS = { + "rexml" => "3.0.0", + "rss" => "3.0.0", + "webrick" => "3.0.0", + "matrix" => "3.1.0", + "net-ftp" => "3.1.0", + "net-imap" => "3.1.0", + "net-pop" => "3.1.0", + "net-smtp" => "3.1.0", + "abbrev" => "3.4.0", + "observer" => "3.4.0", + "getoptlong" => "3.4.0", + "resolv-replace" => "3.4.0", + "rinda" => "3.4.0", + "nkf" => "3.4.0", + "syslog" => "3.4.0", + "drb" => "3.4.0", + "mutex_m" => "3.4.0", + "csv" => "3.4.0", + "base64" => "3.4.0" + }.freeze +end diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index 1520deaf316a87..b96edd5e2d81f5 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -29,29 +29,6 @@ end module Gem - - BUNDLED_GEMS = { - "rexml" => "3.0.0", - "rss" => "3.0.0", - "webrick" => "3.0.0", - "matrix" => "3.1.0", - "net-ftp" => "3.1.0", - "net-imap" => "3.1.0", - "net-pop" => "3.1.0", - "net-smtp" => "3.1.0", - "abbrev" => "3.4.0", - "observer" => "3.4.0", - "getoptlong" => "3.4.0", - "resolv-replace" => "3.4.0", - "rinda" => "3.4.0", - "nkf" => "3.4.0", - "syslog" => "3.4.0", - "drb" => "3.4.0", - "mutex_m" => "3.4.0", - "csv" => "3.4.0", - "base64" => "3.4.0" - }.freeze - class Specification include ::Bundler::MatchMetadata include ::Bundler::MatchPlatform diff --git a/lib/bundler/rubygems_integration.rb b/lib/bundler/rubygems_integration.rb index 8f2b6994edaf6d..0b82729a48989d 100644 --- a/lib/bundler/rubygems_integration.rb +++ b/lib/bundler/rubygems_integration.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "rubygems" unless defined?(Gem) +require "bundled_gems" unless defined?(Gem::BUNDLED_GEMS) module Bundler class RubygemsIntegration @@ -225,6 +226,20 @@ def security_policies end end + def reverse_rubygems_kernel_mixin + # Disable rubygems' gem activation system + if Gem.respond_to?(:discover_gems_on_require=) + Gem.discover_gems_on_require = false + else + kernel = (class << ::Kernel; self; end) + [kernel, ::Kernel].each do |k| + if k.private_method_defined?(:gem_original_require) + redefine_method(k, :require, k.instance_method(:gem_original_require)) + end + end + end + end + def replace_require(specs) return if [::Kernel.singleton_class, ::Kernel].any?{|klass| klass.respond_to?(:no_warning_require)} @@ -370,7 +385,11 @@ def replace_bin_path(specs_by_name) def replace_entrypoints(specs) specs_by_name = add_default_gems_to(specs) - replace_require(specs) + if defined?(::Gem::BUNDLED_GEMS) + replace_require(specs) + else + reverse_rubygems_kernel_mixin + end replace_gem(specs, specs_by_name) stub_rubygems(specs) replace_bin_path(specs_by_name) diff --git a/spec/bundler/runtime/setup_spec.rb b/spec/bundler/runtime/setup_spec.rb index 88ec1bcdc95a3a..0cafd4505cccb5 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -1556,7 +1556,12 @@ def require(path) gem "rack" G + ruby <<-R + module Gem + remove_const :BUNDLED_GEMS if defined?(BUNDLED_GEMS) + BUNDLED_GEMS = { "csv" => "1.0.0" } + end require 'bundler/setup' require 'csv' R @@ -1575,6 +1580,10 @@ def require(path) G ruby <<-R + module Gem + remove_const :BUNDLED_GEMS if defined?(BUNDLED_GEMS) + BUNDLED_GEMS = { "csv" => "1.0.0" } + end require 'csv' require 'bundler/setup' require 'csv' @@ -1594,6 +1603,10 @@ def require(path) G ruby <<-R + module Gem + remove_const :BUNDLED_GEMS if defined?(BUNDLED_GEMS) + BUNDLED_GEMS = { "csv" => "1.0.0" } + end require 'bundler/setup' require 'csv' R @@ -1615,6 +1628,10 @@ def require(path) G ruby <<-R + module Gem + remove_const :BUNDLED_GEMS if defined?(BUNDLED_GEMS) + BUNDLED_GEMS = { "csv" => "1.0.0", "net-imap" => "0.0.1" } + end require 'bundler/setup' begin require 'net/imap'