From e09da0d0924ed046f10129536fe2512966123ddf Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 9 Mar 2009 07:03:39 +0000 Subject: [PATCH] * lib/rubygems/installer.rb (Gem::Installer#initialize): env may not be under /usr/bin. * lib/rubygems/installer.rb (Gem::Installer#shebang): uses /bin/sh if shebang has any options, since env shebang trick does not work with options. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22853 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ lib/rubygems/installer.rb | 39 +++++++++++++++++++++++---------------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7b3663eabe..aeb82acd7b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Mar 9 16:03:37 2009 Nobuyoshi Nakada + + * lib/rubygems/installer.rb (Gem::Installer#initialize): env may + not be under /usr/bin. + + * lib/rubygems/installer.rb (Gem::Installer#shebang): uses /bin/sh + if shebang has any options, since env shebang trick does no + work with options. + Mon Mar 9 15:19:55 2009 Nobuyoshi Nakada * instruby.rb (manpages): use basename to compare and for Tempfile. diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index bb08549c21..37264103b4 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -98,7 +98,12 @@ class Gem::Installer :source_index => Gem.source_index, }.merge options - @env_shebang = options[:env_shebang] + if @env_shebang = options[:env_shebang] + unless File.executable?(shebang = "/usr/bin/env") + shebang = "/bin/env" + end + @env_shebang = shebang + end @force = options[:force] gem_home = options[:install_dir] @gem_home = Pathname.new(gem_home).expand_path @@ -387,22 +392,24 @@ class Gem::Installer # necessary. def shebang(bin_file_name) - if @env_shebang then - "#!/usr/bin/env " + Gem::ConfigMap[:ruby_install_name] + ruby_name = Gem::ConfigMap[:ruby_install_name] unless @env_shebang + path = File.join @gem_dir, @spec.bindir, bin_file_name + first_line = File.open(path, "rb") {|file| file.gets} + if /\A#!/ =~ first_line then + # Preserve extra words on shebang line, like "-w". Thanks RPA. + shebang = first_line.sub(/\A\#!.*?ruby\S*(?=\s*(\S+))/, "#!#{Gem.ruby}") + shebang.strip! # Avoid nasty ^M issues. + if ruby_name and $1 + %{#!/bin/sh\n'exec' '#{ruby_name}' '-x' "$0" "$@"\n#{shebang}} + else + shebang + end else - path = File.join @gem_dir, @spec.bindir, bin_file_name - - File.open(path, "rb") do |file| - first_line = file.gets - if first_line =~ /^#!/ then - # Preserve extra words on shebang line, like "-w". Thanks RPA. - shebang = first_line.sub(/\A\#!.*?ruby\S*/, "#!#{Gem.ruby}") - else - # Create a plain shebang line. - shebang = "#!#{Gem.ruby}" - end - - shebang.strip # Avoid nasty ^M issues. + # Create a plain shebang line. + if ruby_name + "#!#@env_shebang #{ruby_name}" + else + "#!#{Gem.ruby}" end end end