summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2019-11-30 15:27:59 +0100
committerDavid Rodríguez <deivid.rodriguez@riseup.net>2019-12-01 15:33:55 +0100
commitf4a141182d37d29e34f3887a0a7d3e72fc798e46 (patch)
treea053d46e7d2ef65e96a8ca5cf3431b2283a8452f
parent88bc81b26e1fa409a384925ae865e477073b4f03 (diff)
downloadbundler-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.
-rw-r--r--spec/rubygems/rubygems.rb9
-rw-r--r--spec/spec_helper.rb2
-rw-r--r--spec/support/rubygems_ext.rb4
-rw-r--r--spec/support/rubygems_version_manager.rb44
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