[前][次][番号順一覧][スレッド一覧]

ruby-changes:4062

From: ko1@a...
Date: Wed, 20 Feb 2008 13:09:15 +0900 (JST)
Subject: [ruby-changes:4062] nobu - Ruby:r15552 (ruby_1_8, trunk): * instruby.rb (parse_args): added --dir-mode, --script-mode and

nobu	2008-02-20 13:08:54 +0900 (Wed, 20 Feb 2008)

  New Revision: 15552

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/instruby.rb
    branches/ruby_1_8/version.h
    trunk/ChangeLog
    trunk/instruby.rb

  Log:
    * 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.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=15552&r2=15551&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15552&r2=15551&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/instruby.rb?r1=15552&r2=15551&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/version.h?r1=15552&r2=15551&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/instruby.rb?r1=15552&r2=15551&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15551)
+++ ChangeLog	(revision 15552)
@@ -1,3 +1,22 @@
+Wed Feb 20 13:08:52 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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.
+
 Wed Feb 20 10:04:22 2008  NAKAMURA Usaku  <usa@r...>
 
 	* io.c (open_key_args): set arg->io even if no options passed.
Index: instruby.rb
===================================================================
--- instruby.rb	(revision 15551)
+++ instruby.rb	(revision 15552)
@@ -14,7 +14,7 @@
 STDOUT.sync = true
 File.umask(0)
 
-def parse_args()
+def parse_args(argv = ARGV)
   $mantype = 'doc'
   $destdir = nil
   $extout = nil
@@ -26,6 +26,10 @@
   $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 @@
     $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 @@
   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.on('--cmd-type=TYPE', %w[bat cmd plain]) {|cmd| $cmdtype = (cmd unless cmd == 'plain')}
 
-  opt.parse! rescue abort [$!.message, opt].join("\n")
+  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-(?!-).*#{'%s' % 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 @@
   end
 
   $rdocdir ||= $mflags.defined?('RDOCOUT')
+
+  $dir_mode ||= $prog_mode | 0700
+  $script_mode ||= $prog_mode
 end
 
 parse_args()
@@ -127,7 +153,7 @@
       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(srcdir, dest, options = {})
@@ -159,9 +185,10 @@
 
 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)
@@ -194,7 +221,7 @@
 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]
@@ -256,47 +283,41 @@
   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
+    end
+    shebang.sub!(/^\#!.*?ruby\b/) {"#!" + ruby_shebang}
+    shebang.sub!(/\r$/, '')
+    body.gsub!(/\r$/, '')
 
-      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"))
+    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" %*
@@ -305,7 +326,14 @@
 __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
@@ -366,10 +394,12 @@
   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
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 15551)
+++ ruby_1_8/ChangeLog	(revision 15552)
@@ -1,3 +1,22 @@
+Wed Feb 20 13:08:52 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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.
+
 Tue Feb 19 18:34:32 2008  Tanaka Akira  <akr@f...>
 
 	* gc.c (STACK_LENGTH) [SPARC] : 0x80 offset removed.  [ruby-dev:33857]
Index: ruby_1_8/version.h
===================================================================
--- ruby_1_8/version.h	(revision 15551)
+++ ruby_1_8/version.h	(revision 15552)
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.6"
-#define RUBY_RELEASE_DATE "2008-02-19"
+#define RUBY_RELEASE_DATE "2008-02-20"
 #define RUBY_VERSION_CODE 186
-#define RUBY_RELEASE_CODE 20080219
+#define RUBY_RELEASE_CODE 20080220
 #define RUBY_PATCHLEVEL 5000
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 6
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 19
+#define RUBY_RELEASE_DAY 20
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
Index: ruby_1_8/instruby.rb
===================================================================
--- ruby_1_8/instruby.rb	(revision 15551)
+++ ruby_1_8/instruby.rb	(revision 15552)
@@ -14,7 +14,7 @@
 STDOUT.sync = true
 File.umask(0)
 
-def parse_args()
+def parse_args(argv = ARGV)
   $mantype = 'doc'
   $destdir = nil
   $extout = nil
@@ -26,6 +26,10 @@
   $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 @@
     $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 @@
   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.on('--cmd-type=TYPE', %w[bat cmd plain]) {|cmd| $cmdtype = (cmd unless cmd == 'plain')}
 
-  opt.parse! rescue abort [$!.message, opt].join("\n")
+  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 @@
   end
 
   $rdocdir ||= $mflags.defined?('RDOCOUT')
+
+  $dir_mode ||= $prog_mode | 0700
+  $script_mode ||= $prog_mode
 end
 
 parse_args()
@@ -127,29 +153,42 @@
       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 @@
 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 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 @@
     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
+    end
+    shebang.sub!(/^\#!.*?ruby\b/) {"#!" + ruby_shebang}
+    shebang.sub!(/\r$/, '')
+    body.gsub!(/\r$/, '')
 
-      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"))
+    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 @@
 __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 @@
   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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]