1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[rubygems/rubygems] Support binstubs with --enable-load-relative prolog

32a5e9057a
This commit is contained in:
David Rodríguez 2019-10-21 19:26:51 +02:00 committed by git
parent 044b0ae8e0
commit 7d42b442bb
2 changed files with 208 additions and 66 deletions

View file

@ -220,7 +220,17 @@ class Gem::Installer
existing = nil
File.open generated_bin, 'rb' do |io|
next unless io.gets =~ /^#!/ # shebang
line = io.gets
shebang = /^#!.*ruby/
if load_relative_enabled?
until line.nil? || line =~ shebang do
line = io.gets
end
end
next unless line =~ shebang
io.gets # blankline
# TODO detect a specially formatted comment instead of trying
@ -585,7 +595,6 @@ class Gem::Installer
#
def shebang(bin_file_name)
ruby_name = ruby_install_name if @env_shebang
path = File.join gem_dir, spec.bindir, bin_file_name
first_line = File.open(path, "rb") {|file| file.gets } || ""
@ -614,14 +623,12 @@ class Gem::Installer
end
"#!#{which}"
elsif not ruby_name
"#!#{Gem.ruby}#{opts}"
elsif opts
"#!/bin/sh\n'exec' #{ruby_name.dump} '-x' \"$0\" \"$@\"\n#{shebang}"
else
elsif @env_shebang
# Create a plain shebang line.
@env_path ||= ENV_PATHS.find {|env_path| File.executable? env_path }
"#!#{@env_path} #{ruby_name}"
"#!#{@env_path} #{ruby_install_name}"
else
"#{bash_prolog_script}#!#{Gem.ruby}#{opts}"
end
end
@ -980,4 +987,29 @@ TEXT
def ruby_install_name
rb_config["ruby_install_name"]
end
def load_relative_enabled?
rb_config["LIBRUBY_RELATIVE"] == 'yes'
end
def bash_prolog_script
if load_relative_enabled?
script = +<<~EOS
bindir="${0%/*}"
EOS
script << %Q(exec "$bindir/#{ruby_install_name}" "-x" "$0" "$@"\n)
<<~EOS
#!/bin/sh
# -*- ruby -*-
_=_\\
=begin
#{script.chomp}
=end
EOS
else
""
end
end
end

View file

@ -18,6 +18,7 @@ class TestGemInstaller < Gem::InstallerTestCase
end
def test_app_script_text
load_relative "no" do
installer = setup_base_installer
util_make_exec @spec, ''
@ -57,6 +58,7 @@ end
wrapper = installer.app_script_text 'executable'
assert_equal expected, wrapper
end
end
def test_check_executable_overwrite
installer = setup_base_installer
@ -724,6 +726,7 @@ gem 'other', version
def test_generate_bin_uses_default_shebang
pend "Symlinks not supported or not enabled" unless symlink_supported?
load_relative 'no' do
installer = setup_base_installer
installer.wrappers = true
@ -736,6 +739,7 @@ gem 'other', version
assert_match(/\A#!/, shebang_line)
assert_match(/#{default_shebang}/, shebang_line)
end
end
def test_generate_bin_with_dangling_symlink
gem_with_dangling_symlink = File.expand_path("packages/ascii_binder-0.1.10.1.gem", __dir__)
@ -1804,6 +1808,7 @@ gem 'other', version
end
def test_shebang
load_relative "no" do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/ruby"
@ -1812,6 +1817,7 @@ gem 'other', version
assert_equal "#!#{Gem.ruby}", shebang
end
end
def test_process_options
installer = setup_base_installer
@ -1844,6 +1850,7 @@ gem 'other', version
end
def test_shebang_arguments
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/ruby -ws"
@ -1852,8 +1859,25 @@ gem 'other', version
assert_equal "#!#{Gem.ruby} -ws", shebang
end
end
def test_shebang_arguments_with_load_relative
load_relative 'yes' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/ruby -ws"
shebang = installer.shebang 'executable'
shebang_lines = shebang.split "\n"
assert_equal "#!/bin/sh", shebang_lines.shift
assert_includes shebang_lines, "#!#{Gem.ruby} -ws"
end
end
def test_shebang_empty
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, ''
@ -1861,8 +1885,10 @@ gem 'other', version
shebang = installer.shebang 'executable'
assert_equal "#!#{Gem.ruby}", shebang
end
end
def test_shebang_env
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/env ruby"
@ -1871,8 +1897,10 @@ gem 'other', version
assert_equal "#!#{Gem.ruby}", shebang
end
end
def test_shebang_env_arguments
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/env ruby -ws"
@ -1881,6 +1909,22 @@ gem 'other', version
assert_equal "#!#{Gem.ruby} -ws", shebang
end
end
def test_shebang_env_arguments_with_load_relative
load_relative 'yes' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/env ruby -ws"
shebang = installer.shebang 'executable'
shebang_lines = shebang.split "\n"
assert_equal "#!/bin/sh", shebang_lines.shift
assert_includes shebang_lines, "#!#{Gem.ruby} -ws"
end
end
def test_shebang_env_shebang
installer = setup_base_installer
@ -1897,6 +1941,7 @@ gem 'other', version
end
def test_shebang_nested
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/opt/local/ruby/bin/ruby"
@ -1905,8 +1950,10 @@ gem 'other', version
assert_equal "#!#{Gem.ruby}", shebang
end
end
def test_shebang_nested_arguments
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/opt/local/ruby/bin/ruby -ws"
@ -1915,8 +1962,25 @@ gem 'other', version
assert_equal "#!#{Gem.ruby} -ws", shebang
end
end
def test_shebang_nested_arguments_with_load_relative
load_relative 'yes' do
installer = setup_base_installer
util_make_exec @spec, "#!/opt/local/ruby/bin/ruby -ws"
shebang = installer.shebang 'executable'
shebang_lines = shebang.split "\n"
assert_equal "#!/bin/sh", shebang_lines.shift
assert_includes shebang_lines, "#!#{Gem.ruby} -ws"
end
end
def test_shebang_version
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/ruby18"
@ -1925,8 +1989,10 @@ gem 'other', version
assert_equal "#!#{Gem.ruby}", shebang
end
end
def test_shebang_version_arguments
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/ruby18 -ws"
@ -1935,8 +2001,25 @@ gem 'other', version
assert_equal "#!#{Gem.ruby} -ws", shebang
end
end
def test_shebang_version_arguments_with_load_relative
load_relative 'yes' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/ruby18 -ws"
shebang = installer.shebang 'executable'
shebang_lines = shebang.split "\n"
assert_equal "#!/bin/sh", shebang_lines.shift
assert_includes shebang_lines, "#!#{Gem.ruby} -ws"
end
end
def test_shebang_version_env
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/env ruby18"
@ -1945,8 +2028,10 @@ gem 'other', version
assert_equal "#!#{Gem.ruby}", shebang
end
end
def test_shebang_version_env_arguments
load_relative 'no' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/env ruby18 -ws"
@ -1955,6 +2040,22 @@ gem 'other', version
assert_equal "#!#{Gem.ruby} -ws", shebang
end
end
def test_shebang_version_env_arguments_with_load_relative
load_relative 'yes' do
installer = setup_base_installer
util_make_exec @spec, "#!/usr/bin/env ruby18 -ws"
shebang = installer.shebang 'executable'
shebang_lines = shebang.split "\n"
assert_equal "#!/bin/sh", shebang_lines.shift
assert_includes shebang_lines, "#!#{Gem.ruby} -ws"
end
end
def test_shebang_custom
installer = setup_base_installer
@ -2283,4 +2384,13 @@ gem 'other', version
def mask
0100755
end
def load_relative(value)
orig_LIBRUBY_RELATIVE = RbConfig::CONFIG['LIBRUBY_RELATIVE']
RbConfig::CONFIG['LIBRUBY_RELATIVE'] = value
yield
ensure
RbConfig::CONFIG['LIBRUBY_RELATIVE'] = orig_LIBRUBY_RELATIVE
end
end