ruby-changes:70059
From: David <ko1@a...>
Date: Sun, 5 Dec 2021 05:48:03 +0900 (JST)
Subject: [ruby-changes:70059] a72aecac3a (master): [rubygems/rubygems] Don't write outside of destdir when regenerating plugins
https://git.ruby-lang.org/ruby.git/commit/?id=a72aecac3a From a72aecac3ae81e955997e4d789504e60196e2697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@r...> Date: Fri, 5 Nov 2021 20:57:41 +0100 Subject: [rubygems/rubygems] Don't write outside of destdir when regenerating plugins https://github.com/rubygems/rubygems/commit/141ef4cb9a --- lib/rubygems/commands/pristine_command.rb | 10 ++++++++-- lib/rubygems/commands/setup_command.rb | 1 + test/rubygems/test_gem_commands_setup_command.rb | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/rubygems/commands/pristine_command.rb b/lib/rubygems/commands/pristine_command.rb index 41547ce73bf..13979b0a590 100644 --- a/lib/rubygems/commands/pristine_command.rb +++ b/lib/rubygems/commands/pristine_command.rb @@ -50,6 +50,11 @@ class Gem::Commands::PristineCommand < Gem::Command https://github.com/ruby/ruby/blob/trunk/lib/rubygems/commands/pristine_command.rb#L50 options[:env_shebang] = value end + add_option('-i', '--install-dir DIR', + 'Gem repository to get binstubs and plugins installed') do |value, options| + options[:install_dir] = File.expand_path(value) + end + add_option('-n', '--bindir DIR', 'Directory where executables are', 'located') do |value, options| @@ -163,11 +168,12 @@ extensions will be restored. https://github.com/ruby/ruby/blob/trunk/lib/rubygems/commands/pristine_command.rb#L168 end bin_dir = options[:bin_dir] if options[:bin_dir] + install_dir = options[:install_dir] if options[:install_dir] installer_options = { :wrappers => true, :force => true, - :install_dir => spec.base_dir, + :install_dir => install_dir || spec.base_dir, :env_shebang => env_shebang, :build_args => spec.build_args, :bin_dir => bin_dir, @@ -177,7 +183,7 @@ extensions will be restored. https://github.com/ruby/ruby/blob/trunk/lib/rubygems/commands/pristine_command.rb#L183 installer = Gem::Installer.for_spec(spec, installer_options) installer.generate_bin elsif options[:only_plugins] - installer = Gem::Installer.for_spec(spec) + installer = Gem::Installer.for_spec(spec, installer_options) installer.generate_plugins else installer = Gem::Installer.at(gem, installer_options) diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb index adceb62dce3..ed1fcaa4b89 100644 --- a/lib/rubygems/commands/setup_command.rb +++ b/lib/rubygems/commands/setup_command.rb @@ -610,6 +610,7 @@ abort "#{deprecation_message}" https://github.com/ruby/ruby/blob/trunk/lib/rubygems/commands/setup_command.rb#L610 args = %w[--all --only-plugins --silent] args << "--bindir=#{bindir}" + args << "--install-dir=#{default_dir}" command = Gem::Commands::PristineCommand.new command.invoke(*args) diff --git a/test/rubygems/test_gem_commands_setup_command.rb b/test/rubygems/test_gem_commands_setup_command.rb index 08f94d52bfb..5cf94a1dc99 100644 --- a/test/rubygems/test_gem_commands_setup_command.rb +++ b/test/rubygems/test_gem_commands_setup_command.rb @@ -156,6 +156,21 @@ class TestGemCommandsSetupCommand < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_commands_setup_command.rb#L156 assert_match %r{\A#!\s*#{bin_env}#{ruby_exec}}, File.read(gem_bin_path) end + def test_destdir_flag_does_not_try_to_write_to_the_default_gem_home + FileUtils.chmod "-w", File.join(@gemhome, "plugins") + + destdir = File.join(@tempdir, 'foo') + + @cmd.options[:destdir] = destdir + @cmd.execute + + spec = Gem::Specification.load("bundler/bundler.gemspec") + + spec.executables.each do |e| + assert_path_exist File.join destdir, @gemhome.gsub(/^[a-zA-Z]:/, ''), 'gems', spec.full_name, spec.bindir, e + end + end + def test_files_in assert_equal %w[rubygems.rb rubygems/requirement.rb rubygems/ssl_certs/rubygems.org/foo.pem], @cmd.files_in('lib').sort -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/