From 402fd96ddc401cf35bced8d394c44df98d6fc466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ondruch?= Date: Tue, 12 Dec 2023 14:38:45 +0100 Subject: [PATCH] [rubygems/rubygems] Make sure `--no-user-install` is respected for auto user installation The `options[:user_install]` might have three states: * `true`: `--user-install` * `false`: `--no-user-install` and * `nil`: option was not specified However, this had not been respected previously and the `false` and `nil` were treated the same. This could lead to auto user installation despite `--no-user-install` being specified on the command line. Fixes https://github.com/rubygems/rubygems/pull/7237 https://github.com/rubygems/rubygems/commit/9281545474 --- lib/rubygems/installer.rb | 2 +- test/rubygems/test_gem_installer.rb | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index b4375c3f1c6b05..acb49f510a5ed4 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -682,7 +682,7 @@ def process_options # :nodoc: if @build_root.nil? if options[:user_install] @gem_home = Gem.user_dir - elsif !ENV.key?("GEM_HOME") && (File.exist?(Gem.dir) && !File.writable?(Gem.dir)) + elsif options[:user_install].nil? && !ENV.key?("GEM_HOME") && (File.exist?(Gem.dir) && !File.writable?(Gem.dir)) say "Defaulting to user installation because default installation directory (#{Gem.dir}) is not writable." @gem_home = Gem.user_dir end diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index 4fa8b7f4fefc4d..3110ac63a667bb 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -1995,6 +1995,27 @@ def test_process_options_fallback_to_user_install_when_gem_home_not_writable ENV["GEM_HOME"] = orig_gem_home end + def test_process_options_does_not_fallback_to_user_install_when_gem_home_not_writable_and_no_user_install + if Process.uid.zero? + pend("skipped in root privilege") + return + end + + orig_gem_home = ENV.delete("GEM_HOME") + + @gem = setup_base_gem + + FileUtils.chmod 0o000, @gemhome + + installer = use_ui(@ui) { Gem::Installer.at @gem, user_install: false } + + assert_equal @gemhome, installer.gem_home + assert_empty @ui.output.strip + ensure + FileUtils.chmod 0o755, @gemhome + ENV["GEM_HOME"] = orig_gem_home + end + def test_shebang_arguments load_relative "no" do installer = setup_base_installer