diff options
author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2019-11-30 15:27:59 +0100 |
---|---|---|
committer | David RodrÃguez <deivid.rodriguez@riseup.net> | 2019-12-01 15:33:55 +0100 |
commit | f4a141182d37d29e34f3887a0a7d3e72fc798e46 (patch) | |
tree | a053d46e7d2ef65e96a8ca5cf3431b2283a8452f /spec | |
parent | 88bc81b26e1fa409a384925ae865e477073b4f03 (diff) | |
download | bundler-f4a141182d37d29e34f3887a0a7d3e72fc798e46.tar.gz |
Improve rubygems switching code
Previous version was overly complicated and brittle, and didn't support,
for example, using custom branches in rubygems inside the `RGV`
environment variable.
Now the `RGV` env variable supports:
* Local paths.
* Arbitrary tags or branches in rubygems repo.
* Released rubygems versions.
Diffstat (limited to 'spec')
-rw-r--r-- | spec/rubygems/rubygems.rb | 9 | ||||
-rw-r--r-- | spec/spec_helper.rb | 2 | ||||
-rw-r--r-- | spec/support/rubygems_ext.rb | 4 | ||||
-rw-r--r-- | spec/support/rubygems_version_manager.rb | 44 |
4 files changed, 14 insertions, 45 deletions
diff --git a/spec/rubygems/rubygems.rb b/spec/rubygems/rubygems.rb deleted file mode 100644 index 6fa63013bf..0000000000 --- a/spec/rubygems/rubygems.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -require_relative "../support/rubygems_version_manager" - -RubygemsVersionManager.new(ENV["RGV"]).switch - -$:.delete("#{Spec::Path.spec_dir}/rubygems") - -require "rubygems" diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9702ab71f5..ba21d22fbd 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -82,7 +82,7 @@ RSpec.configure do |config| config.before :suite do require_relative "support/rubygems_ext" Spec::Rubygems.setup - ENV["RUBYOPT"] = "#{ENV["RUBYOPT"]} -I#{Spec::Path.spec_dir}/rubygems -r#{Spec::Path.spec_dir}/support/hax.rb" + ENV["RUBYOPT"] = "#{ENV["RUBYOPT"]} -r#{Spec::Path.spec_dir}/support/hax.rb" ENV["BUNDLE_SPEC_RUN"] = "true" ENV["BUNDLE_USER_CONFIG"] = ENV["BUNDLE_USER_CACHE"] = ENV["BUNDLE_USER_PLUGIN"] = nil ENV["GEMRC"] = nil diff --git a/spec/support/rubygems_ext.rb b/spec/support/rubygems_ext.rb index 5bfcac5ac4..3914465371 100644 --- a/spec/support/rubygems_ext.rb +++ b/spec/support/rubygems_ext.rb @@ -39,7 +39,9 @@ module Spec end def gem_load(gem_name, bin_container) - require_relative "../rubygems/rubygems" + require_relative "rubygems_version_manager" + RubygemsVersionManager.new(ENV["RGV"]).switch + gem_load_and_activate(gem_name, bin_container) end diff --git a/spec/support/rubygems_version_manager.rb b/spec/support/rubygems_version_manager.rb index 356d391c08..cf9ad77102 100644 --- a/spec/support/rubygems_version_manager.rb +++ b/spec/support/rubygems_version_manager.rb @@ -15,11 +15,9 @@ class RubygemsVersionManager def switch return if use_system? - unrequire_rubygems_if_needed - switch_local_copy_if_needed - prepare_environment + unrequire_rubygems_if_needed end private @@ -37,7 +35,8 @@ private ruby << RbConfig::CONFIG["EXEEXT"] cmd = [ruby, $0, *ARGV].compact - cmd[1, 0] = "--disable-gems" + + ENV["RUBYOPT"] = "-I#{local_copy_path.join("lib")} #{ENV["RUBYOPT"]}" exec(ENV, *cmd) end @@ -49,33 +48,26 @@ private sys_exec!("git remote update") sys_exec!("git checkout #{target_tag_version} --quiet") end - end - def prepare_environment - $:.unshift File.expand_path("lib", local_copy_path) + ENV["RGV"] = local_copy_path.to_s end def rubygems_unrequire_needed? - defined?(Gem::VERSION) && Gem::VERSION != target_gem_version + !$LOADED_FEATURES.include?(local_copy_path.join("lib/rubygems.rb").to_s) end def local_copy_switch_needed? - !env_version_is_path? && target_gem_version != local_copy_version - end - - def target_gem_version - @target_gem_version ||= resolve_target_gem_version + !env_version_is_path? && target_tag_version != local_copy_tag end def target_tag_version @target_tag_version ||= resolve_target_tag_version end - def local_copy_version - gemspec_contents = File.read(local_copy_path.join("lib/rubygems.rb")) - version_regexp = /VERSION = ["'](.*)["']/ - - version_regexp.match(gemspec_contents)[1] + def local_copy_tag + Dir.chdir(local_copy_path) do + sys_exec!("git rev-parse --abbrev-ref HEAD") + end end def local_copy_path @@ -106,22 +98,6 @@ private def resolve_target_tag_version return "v#{@env_version}" if @env_version.match(/^\d/) - return "master" if @env_version == master_gem_version - @env_version end - - def resolve_target_gem_version - return local_copy_version if env_version_is_path? - - return @env_version[1..-1] if @env_version.match(/^v/) - - return master_gem_version if @env_version == "master" - - @env_version - end - - def master_gem_version - "3.1.0.pre1" - end end |