summaryrefslogtreecommitdiff
path: root/instruby.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-20 04:08:54 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-20 04:08:54 +0000
commit9a4b141f97bdb5aeee38565bd5c20ea628018bd5 (patch)
tree5347ceae689101a913f397f8d7d340dfb340479a /instruby.rb
parentc90f8f09189bf17c71ec0c70257f0a5e4242b51b (diff)
* instruby.rb (parse_args): added --dir-mode, --script-mode and
--cmd-type options. [ruby-dev:33816] * instruby.rb (parse_args): added bin-arch and bin-comm to install type, for compiled files and script files. * instruby.rb (parse_args): deal with make style command line macros, and count as long syle options if prefixed with INSTALL_. * instruby.rb (makedirs): use $dir_mode. [ruby-dev:33805] * instruby.rb (open_for_install): set file mode, which is now permission mode instead of access mode. * instruby.rb (bin-comm): installs scripts with replacing shebang lines. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@15552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'instruby.rb')
-rwxr-xr-xinstruby.rb130
1 files changed, 86 insertions, 44 deletions
diff --git a/instruby.rb b/instruby.rb
index 901cd92afc..aa93e6a721 100755
--- a/instruby.rb
+++ b/instruby.rb
@@ -14,7 +14,7 @@ require 'tempfile'
STDOUT.sync = true
File.umask(0)
-def parse_args()
+def parse_args(argv = ARGV)
$mantype = 'doc'
$destdir = nil
$extout = nil
@@ -26,6 +26,10 @@ def parse_args()
$rdocdir = nil
$data_mode = 0644
$prog_mode = 0755
+ $dir_mode = nil
+ $script_mode = nil
+ $cmdtype = ('bat' if File::ALT_SEPARATOR == '\\')
+ mflags = []
opt = OptionParser.new
opt.on('-n') {$dryrun = true}
opt.on('--dest-dir=DIR') {|dir| $destdir = dir}
@@ -39,7 +43,7 @@ def parse_args()
$mflags.concat(v)
end
opt.on('-i', '--install=TYPE',
- [:local, :bin, :lib, :man, :ext, :"ext-arch", :"ext-comm", :rdoc]) do |ins|
+ [:local, :bin, :"bin-arch", :"bin-comm", :lib, :man, :ext, :"ext-arch", :"ext-comm", :rdoc]) do |ins|
$install << ins
end
opt.on('--data-mode=OCTAL-MODE', OptionParser::OctalInteger) do |mode|
@@ -48,20 +52,39 @@ def parse_args()
opt.on('--prog-mode=OCTAL-MODE', OptionParser::OctalInteger) do |mode|
$prog_mode = mode
end
+ opt.on('--dir-mode=OCTAL-MODE', OptionParser::OctalInteger) do |mode|
+ $dir_mode = mode
+ end
+ opt.on('--script-mode=OCTAL-MODE', OptionParser::OctalInteger) do |mode|
+ $script_mode = mode
+ end
opt.on('--installed-list [FILENAME]') {|name| $installed_list = name}
opt.on('--rdoc-output [DIR]') {|dir| $rdocdir = dir}
-
- opt.parse! rescue abort [$!.message, opt].join("\n")
+ opt.on('--cmd-type=TYPE', %w[bat cmd plain]) {|cmd| $cmdtype = (cmd unless cmd == 'plain')}
+
+ opt.order!(argv) do |v|
+ case v
+ when /\AINSTALL[-_]([-\w]+)=(.*)/
+ argv.unshift("--#{$1.tr('_', '-')}=#{$2}")
+ when /\A\w[-\w+]*=\z/
+ mflags << v
+ when /\A\w[-\w+]*\z/
+ $install << v.intern
+ else
+ raise OptionParser::InvalidArgument, v
+ end
+ end rescue abort [$!.message, opt].join("\n")
$make, *rest = Shellwords.shellwords($make)
$mflags.unshift(*rest) unless rest.empty?
+ $mflags.unshift(*mflags)
def $mflags.set?(flag)
grep(/\A-(?!-).*#{'%c' % flag}/i) { return true }
false
end
def $mflags.defined?(var)
- grep(/\A#{var}=(.*)/) {return $1}
+ grep(/\A#{var}=(.*)/) {return block_given? ? yield($1) : $1}
false
end
@@ -85,6 +108,9 @@ def parse_args()
end
$rdocdir ||= $mflags.defined?('RDOCOUT')
+
+ $dir_mode ||= $prog_mode | 0700
+ $script_mode ||= $prog_mode
end
parse_args()
@@ -127,29 +153,42 @@ def makedirs(dirs)
File.directory?(realdir)
end
end.compact!
- super(dirs, :mode => $prog_mode) unless dirs.empty?
+ super(dirs, :mode => $dir_mode) unless dirs.empty?
end
-def install_recursive(src, dest, options = {})
- noinst = options.delete(:no_install)
- subpath = src.size..-1
- Dir.glob("#{src}/**/*", File::FNM_DOTMATCH) do |src|
- next if /\A\.{1,2}\z/ =~ (base = File.basename(src))
- next if noinst and File.fnmatch?(noinst, File.basename(src))
+def install_recursive(srcdir, dest, options = {})
+ opts = options.clone
+ noinst = opts.delete(:no_install)
+ glob = opts.delete(:glob) || "*"
+ subpath = srcdir.size..-1
+ Dir.glob("#{srcdir}/**/#{glob}") do |src|
+ case base = File.basename(src)
+ when /\A\#.*\#\z/, /~\z/
+ next
+ end
+ if noinst
+ if Array === noinst
+ next if noinst.any? {|n| File.fnmatch?(n, base)}
+ else
+ next if File.fnmatch?(noinst, base)
+ end
+ end
d = dest + src[subpath]
if File.directory?(src)
makedirs(d)
else
- install src, d
+ makedirs(File.dirname(d))
+ install src, d, opts
end
end
end
def open_for_install(path, mode, &block)
unless $dryrun
- open(with_destdir(path), mode, &block)
+ open(realpath = with_destdir(path), "wb", mode, &block)
+ File.chmod(mode, realpath)
end
- $installed_list.puts path if /^w/ =~ mode and $installed_list
+ $installed_list.puts path if $installed_list
end
def with_destdir(dir)
@@ -177,7 +216,7 @@ dll = CONFIG["LIBRUBY_SO"]
lib = CONFIG["LIBRUBY"]
arc = CONFIG["LIBRUBY_A"]
-install?(:local, :arch, :bin) do
+install?(:local, :arch, :bin, :'bin-arch') do
puts "installing binary commands"
makedirs [bindir, libdir, archlibdir]
@@ -214,12 +253,12 @@ if $extout
if noinst = CONFIG["no_install_files"] and noinst.empty?
noinst = nil
end
- install_recursive("#{extout}/#{CONFIG['arch']}", archlibdir, :no_install => noinst)
+ install_recursive("#{extout}/#{CONFIG['arch']}", archlibdir, :no_install => noinst, :mode => $prog_mode)
end
install?(:ext, :comm, :'ext-comm') do
puts "installing extension scripts"
makedirs [rubylibdir, sitelibdir]
- install_recursive("#{extout}/common", rubylibdir)
+ install_recursive("#{extout}/common", rubylibdir, :mode => $data_mode)
end
end
@@ -230,51 +269,45 @@ install?(:rdoc) do
ridatadir = File.join(CONFIG['datadir'], 'ri/$(MAJOR).$(MINOR)/system')
Config.expand(ridatadir)
makedirs [ridatadir]
- install_recursive($rdocdir, ridatadir)
+ install_recursive($rdocdir, ridatadir, :mode => $data_mode)
end
end
-install?(:local, :comm, :bin) do
+install?(:local, :comm, :bin, :'bin-comm') do
puts "installing command scripts"
Dir.chdir srcdir
makedirs [bindir, rubylibdir]
ruby_shebang = File.join(bindir, ruby_install_name)
- if File::ALT_SEPARATOR
- ruby_bin_dosish = ruby_shebang.tr(File::SEPARATOR, File::ALT_SEPARATOR)
+ if $cmdtype
+ ruby_bin = ruby_shebang.tr(File::SEPARATOR, File::ALT_SEPARATOR)
end
for src in Dir["bin/*"]
next unless File.file?(src)
next if /\/[.#]|(\.(old|bak|orig|rej|diff|patch|core)|~|\/core)$/i =~ src
name = ruby_install_name.sub(/ruby/, File.basename(src))
- dest = File.join(bindir, name)
-
- install src, dest, :mode => $prog_mode
-
- next if $dryrun
shebang = ''
body = ''
- open_for_install(dest, "r+") { |f|
+ open(src, "rb") do |f|
shebang = f.gets
body = f.read
-
- if shebang.sub!(/^\#!.*?ruby\b/) {"#!" + ruby_shebang}
- f.rewind
- f.print shebang, body
- f.truncate(f.pos)
- end
- }
-
- if ruby_bin_dosish
- batfile = File.join(bindir, name + ".bat")
- open_for_install(batfile, "wb") {|b|
- b.print((<<EOH+shebang+body+<<EOF).gsub(/\r?\n/, "\r\n"))
+ end
+ shebang.sub!(/^\#!.*?ruby\b/) {"#!" + ruby_shebang}
+ shebang.sub!(/\r$/, '')
+ body.gsub!(/\r$/, '')
+
+ cmd = File.join(bindir, name)
+ cmd << ".#{$cmdtype}" if $cmdtype
+ open_for_install(cmd, $script_mode) do |f|
+ case $cmdtype
+ when "bat"
+ f.print((<<EOH+shebang+body+<<EOF).gsub(/$/, "\r"))
@echo off
@if not "%~d0" == "~d0" goto WinNT
-#{ruby_bin_dosish} -x "#{batfile}" %1 %2 %3 %4 %5 %6 %7 %8 %9
+#{ruby_bin} -x "#{cmd}" %1 %2 %3 %4 %5 %6 %7 %8 %9
@goto endofruby
:WinNT
"%~dp0#{ruby_install_name}" -x "%~f0" %*
@@ -283,7 +316,14 @@ EOH
__END__
:endofruby
EOF
- }
+ when "cmd"
+ f.print(<<EOH, shebang, body)
+@"%~dp0#{ruby_install_name}" -x "%~f0" %*
+@exit /b %ERRORLEVEL%
+EOH
+ else
+ f.print shebang, body
+ end
end
end
end
@@ -347,10 +387,12 @@ install?(:local, :comm, :man) do
end
end
-$install.concat ARGV.collect {|n| n.intern}
$install << :local << :ext if $install.empty?
$install.each do |inst|
- $install_procs[inst].each do |block|
+ if !(procs = $install_procs[inst]) || procs.empty?
+ next warn("unknown install target - #{inst}")
+ end
+ procs.each do |block|
dir = Dir.pwd
begin
block.call