Skip to content

Commit

Permalink
Don't apply --destdir twice when running setup.rb
Browse files Browse the repository at this point in the history
Prior to this patch, if I ran:

    ruby setup.rb --destdir /foo

Then Bundler files would be written into /foo/foo, because destdir was
being prepended, even though `bundler_spec.bin_dir` already included
destdir.
  • Loading branch information
alyssais authored and deivid-rodriguez committed Nov 4, 2021
1 parent fbe4246 commit 9e857ff
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
13 changes: 12 additions & 1 deletion lib/rubygems/commands/setup_command.rb
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,18 @@ def install_default_bundler_gem(bin_dir)

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(Gem.default_dir, "specifications", "bundler-#{bundler_spec.version}.gemspec")
if File.file? normal_gemspec
Expand All @@ -399,7 +411,6 @@ def install_default_bundler_gem(bin_dir)
end

bundler_bin_dir = bundler_spec.bin_dir
bundler_bin_dir = File.join(options[:destdir], bundler_bin_dir) unless Gem.win_platform?
mkdir_p bundler_bin_dir, :mode => 0755
bundler_spec.executables.each do |e|
cp File.join("bundler", bundler_spec.bindir, e), File.join(bundler_bin_dir, e)
Expand Down
22 changes: 22 additions & 0 deletions test/rubygems/test_gem_commands_setup_command.rb
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,28 @@ def test_install_default_bundler_gem_with_force_flag
end
end

def test_install_default_bundler_gem_with_destdir_flag
@cmd.extend FileUtils

bin_dir = File.join(@gemhome, 'bin')

bindir(bin_dir) do
destdir = File.join(@tempdir, 'foo')

@cmd.options[:destdir] = destdir

@cmd.install_default_bundler_gem bin_dir

bundler_spec = Gem::Specification.load("bundler/bundler.gemspec")
default_spec_path = File.join(Gem.default_specifications_dir, "#{bundler_spec.full_name}.gemspec")
spec = Gem::Specification.load(default_spec_path)

spec.executables.each do |e|
assert_path_exist File.join destdir, spec.bin_dir.gsub(/^[a-zA-Z]:/, ''), e
end
end
end

def test_remove_old_lib_files
lib = File.join @install_dir, 'lib'
lib_rubygems = File.join lib, 'rubygems'
Expand Down

0 comments on commit 9e857ff

Please sign in to comment.