From 979d1fa5fe57f441ceca10f513d6009ddd78b8f2 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 21 Jul 2023 12:21:44 +0900 Subject: [PATCH] [rubygems/rubygems] Extract Gem::BUNDLED_GEMS from Bundler https://github.com/rubygems/rubygems/commit/e30e86aa60 --- lib/bundler/rubygems_ext.rb | 23 ----------------------- lib/bundler/rubygems_integration.rb | 24 +++++++++++++++++++++++- spec/bundler/runtime/setup_spec.rb | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index 1520deaf31..b96edd5e2d 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -29,29 +29,6 @@ unless Gem.ruby_version.to_s == RUBY_VERSION || RUBY_PATCHLEVEL == -1 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 8f2b6994ed..29940d75f5 100644 --- a/lib/bundler/rubygems_integration.rb +++ b/lib/bundler/rubygems_integration.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true require "rubygems" unless defined?(Gem) +begin + require "bundled_gems" unless defined?(Gem::BUNDLED_GEMS) +rescue LoadError +end module Bundler class RubygemsIntegration @@ -225,6 +229,20 @@ module Bundler 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 +388,11 @@ module Bundler 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 dde418bf1d..644a93efab 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -1566,7 +1566,12 @@ end 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 @@ -1585,6 +1590,10 @@ end 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' @@ -1604,6 +1613,10 @@ end 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 @@ -1625,6 +1638,10 @@ end 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'