summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/rubygems/installer.rb31
-rw-r--r--test/rubygems/test_gem_dependency_installer.rb2
3 files changed, 19 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d6a065324..bf2b4c363d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Mar 15 12:01:36 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems/installer.rb (Gem::Installer#shebang): fix for env
+ shebang.
+
Sun Mar 15 11:15:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* include/ruby/ruby.h ({RSTRING,RBIGNUM}_EMBED_LEN_MAX): made int.
diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb
index 37264103b4..44bf2f8903 100644
--- a/lib/rubygems/installer.rb
+++ b/lib/rubygems/installer.rb
@@ -71,6 +71,8 @@ class Gem::Installer
end
+ ENV_PATHS = %w[/usr/bin/env /bin/env]
+
##
# Constructs an Installer instance that will install the gem located at
# +gem+. +options+ is a Hash with the following keys:
@@ -98,12 +100,7 @@ class Gem::Installer
:source_index => Gem.source_index,
}.merge options
- if @env_shebang = options[:env_shebang]
- unless File.executable?(shebang = "/usr/bin/env")
- shebang = "/bin/env"
- end
- @env_shebang = shebang
- end
+ @env_shebang = options[:env_shebang]
@force = options[:force]
gem_home = options[:install_dir]
@gem_home = Pathname.new(gem_home).expand_path
@@ -392,25 +389,23 @@ class Gem::Installer
# necessary.
def shebang(bin_file_name)
- ruby_name = Gem::ConfigMap[:ruby_install_name] unless @env_shebang
+ ruby_name = Gem::ConfigMap[: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}
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 = first_line.sub(/\A\#!.*?ruby\S*(?=(\s+\S+))/, "#!#{Gem.ruby}")
+ opts = $1
shebang.strip! # Avoid nasty ^M issues.
- if ruby_name and $1
- %{#!/bin/sh\n'exec' '#{ruby_name}' '-x' "$0" "$@"\n#{shebang}}
- else
- shebang
- end
+ end
+ if !ruby_name
+ "#!#{Gem.ruby}#{opts}"
+ elsif opts
+ %{#!/bin/sh\n'exec' #{ruby_name.dump} '-x' "$0" "$@"\n#{shebang}}
else
# Create a plain shebang line.
- if ruby_name
- "#!#@env_shebang #{ruby_name}"
- else
- "#!#{Gem.ruby}"
- end
+ @env_path ||= ENV_PATHS.find {|path| File.executable?(path)}
+ "#!#{@env_path} #{ruby_name}"
end
end
diff --git a/test/rubygems/test_gem_dependency_installer.rb b/test/rubygems/test_gem_dependency_installer.rb
index bf38c11c18..cf7e569714 100644
--- a/test/rubygems/test_gem_dependency_installer.rb
+++ b/test/rubygems/test_gem_dependency_installer.rb
@@ -257,7 +257,7 @@ class TestGemDependencyInstaller < RubyGemTestCase
inst.install 'a'
end
- assert_match %r|\A#!/usr/bin/env #{Gem::ConfigMap[:RUBY_INSTALL_NAME]}\n|,
+ assert_match %r|\A#!/\S+/env #{Gem::ConfigMap[:RUBY_INSTALL_NAME]}\n|,
File.read(File.join(@gemhome, 'bin', 'a_bin'))
end