aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2022-07-16 12:09:54 +0200
committergit <svn-admin@ruby-lang.org>2022-07-18 19:07:55 +0900
commita74634de106df63fb39a7077561657bb61a0bc97 (patch)
tree6d71307ea1df49a7c664b030c0a18959a58be5b4 /lib
parent01560e1c53ce2e1fcf3cdc2480c6f75ca7c6f0a6 (diff)
downloadruby-a74634de106df63fb39a7077561657bb61a0bc97.tar.gz
[rubygems/rubygems] Fix upgrading RubyGems with a customized `Gem.default_dir`
https://github.com/rubygems/rubygems/commit/16d01f9486
Diffstat (limited to 'lib')
-rw-r--r--lib/rubygems/commands/setup_command.rb28
1 files changed, 9 insertions, 19 deletions
diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb
index 35b500936d..f85d435f58 100644
--- a/lib/rubygems/commands/setup_command.rb
+++ b/lib/rubygems/commands/setup_command.rb
@@ -360,34 +360,24 @@ By default, this RubyGems will install gem as:
end
def install_default_bundler_gem(bin_dir)
- specs_dir = File.join(default_dir, "specifications", "default")
- mkdir_p specs_dir, :mode => 0755
-
- bundler_spec = Dir.chdir("bundler") { Gem::Specification.load("bundler.gemspec") }
-
current_default_spec = Gem::Specification.default_stubs.find {|s| s.name == "bundler" }
- if current_default_spec
- File.delete(current_default_spec.loaded_from)
+ specs_dir = if current_default_spec
Gem::Specification.remove_spec current_default_spec
+ loaded_from = current_default_spec.loaded_from
+ File.delete(loaded_from)
+ File.dirname(loaded_from)
+ else
+ File.join(default_dir, "specifications", "default")
end
+ mkdir_p specs_dir, :mode => 0755
+
+ bundler_spec = Dir.chdir("bundler") { Gem::Specification.load("bundler.gemspec") }
default_spec_path = File.join(specs_dir, "#{bundler_spec.full_name}.gemspec")
Gem.write_binary(default_spec_path, bundler_spec.to_ruby)
bundler_spec = Gem::Specification.load(default_spec_path)
- # The base_dir value for a specification is inferred by walking up from the
- # folder where the spec was `loaded_from`. In the case of default gems, we
- # walk up two levels, because they live at `specifications/default/`, whereas
- # in the case of regular gems we walk up just one level because they live at
- # `specifications/`. However, in this case, the gem we are installing is
- # misdetected as a regular gem, when it's a default gem in reality. This is
- # because when there's a `:destdir`, the `loaded_from` path has changed and
- # doesn't match `Gem.default_specifications_dir` which is the criteria to
- # tag a gem as a default gem. So, in that case, write the correct
- # `@base_dir` directly.
- bundler_spec.instance_variable_set(:@base_dir, File.dirname(File.dirname(specs_dir)))
-
# Remove gemspec that was same version of vendored bundler.
normal_gemspec = File.join(default_dir, "specifications", "bundler-#{bundler_spec.version}.gemspec")
if File.file? normal_gemspec