From: nobu.nakada@... Date: 2004-03-02T14:35:23+09:00 Subject: [ruby-dev:23103] Re: enable-install-rdoc (was Re: --prefix and DESTDIR for bccwin32) なかだです。 At Mon, 1 Mar 2004 23:08:46 +0900, Yukihiro Matsumoto wrote in [ruby-dev:23089]: > |最近、コマンドの実行に失敗するとsystemがfalseを返すかわりに例外 > |を上げるようになったためです。 > > コミットしてください。 他も調べてみました。systemがfalseを返すことに依存している部分は 一応なさそうですが、IO.popenからの例外やProcess.spawnを使ったほ うがよさそうなところがいくつか。 それと、IO.popenやProcess.spawnでコマンド名とargv[0]を別にした 場合、実行できなかったときの例外のメッセージが間違ってました。 * io.c (pipe_open): erred program name should be reported by exceptions, instead of the first argument. * process.c (rb_spawn): ditto. Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.261 diff -u -2 -p -d -r1.261 io.c --- io.c 25 Feb 2004 12:17:39 -0000 1.261 +++ io.c 2 Mar 2004 05:11:21 -0000 @@ -2609,10 +2609,13 @@ pipe_open(argc, argv, pname, mode) #elif defined(_WIN32) int openmode = rb_io_mode_modenum(mode); - char *cmd = pname, *prog = NULL; + char *prog = NULL; #endif + char *cmd = pname; if (!pname) { arg0 = rb_check_argv(argc, argv); if (arg0) pname = StringValuePtr(arg0); + cmd = pname; + if (!pname) pname = RSTRING(argv[0])->ptr; } @@ -2640,5 +2643,5 @@ pipe_open(argc, argv, pname, mode) arg.exec.argc = argc; arg.exec.argv = argv; - arg.exec.prog = pname; + arg.exec.prog = cmd; pid = rb_fork(&status, popen_exec, &arg); } @@ -2693,8 +2696,8 @@ pipe_open(argc, argv, pname, mode) #else if (argc > 0) { - prog = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); - pname = StringValuePtr(prog); + arg0 = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); + cmd = StringValuePtr(arg0); } - fpr = popen(pname, mode); + fpr = popen(cmd, mode); if (!fpr) rb_sys_fail(pname); Index: process.c =================================================================== RCS file: /cvs/ruby/src/ruby/process.c,v retrieving revision 1.99 diff -u -2 -p -d -r1.99 process.c --- process.c 25 Feb 2004 17:35:13 -0000 1.99 +++ process.c 2 Mar 2004 05:18:28 -0000 @@ -1477,4 +1477,5 @@ rb_spawn(argc, argv) earg.prog = prog ? RSTRING(prog)->ptr : 0; status = rb_fork(&status, (int (*)_((void*)))rb_exec, &earg); + if (prog) argv[0] = prog; #elif defined HAVE_SPAWNV if (!argc) { @@ -1484,5 +1485,7 @@ rb_spawn(argc, argv) status = proc_spawn_n(argc, argv, prog); } + if (prog) argv[0] = prog; #else + if (prog) argv[0] = prog; prog = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); status = system(StringValuePtr(prog)); Index: lib/drb/extservm.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/drb/extservm.rb,v retrieving revision 1.1 diff -u -2 -p -d -r1.1 extservm.rb --- lib/drb/extservm.rb 18 Jun 2003 15:43:10 -0000 1.1 +++ lib/drb/extservm.rb 2 Mar 2004 01:04:18 -0000 @@ -85,9 +85,5 @@ module DRb @servers[name] = false end - if RUBY_PLATFORM =~ /mswin32/ - system("cmd /c start /b #{command} #{DRb.uri} #{name}") - else - system("#{command} #{DRb.uri} #{name} &") - end + Process.spawn("#{command} #{DRb.uri} #{name}") end end Index: lib/rdoc/ri/ri_display.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/rdoc/ri/ri_display.rb,v retrieving revision 1.2 diff -u -2 -p -d -r1.2 ri_display.rb --- lib/rdoc/ri/ri_display.rb 12 Jan 2004 03:11:25 -0000 1.2 +++ lib/rdoc/ri/ri_display.rb 1 Mar 2004 19:20:58 -0000 @@ -197,8 +197,15 @@ class DefaultDisplay def setup_pager unless @options.use_stdout - require 'tempfile' - - @save_stdout = STDOUT.clone - STDOUT.reopen(Tempfile.new("ri_")) + for pager in [ ENV['PAGER'], "less", "more", 'pager' ].compact.uniq + begin + pager = IO.popen(pager, "w") + rescue + else + @save_stdout = STDOUT.clone + STDOUT.reopen(pager) + return + end + end + @options.use_stdout = true end end @@ -208,18 +215,6 @@ class DefaultDisplay def page_output unless @options.use_stdout - path = STDOUT.path STDOUT.reopen(@save_stdout) @save_stdout = nil - paged = false - for pager in [ ENV['PAGER'], "less", "more <", 'pager' ].compact.uniq - if system("#{pager} #{path}") - paged = true - break - end - end - if !paged - @options.use_stdout = true - puts File.read(path) - end end end Index: lib/rdoc/diagram.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/rdoc/diagram.rb,v retrieving revision 1.2 diff -u -2 -p -d -r1.2 diagram.rb --- lib/rdoc/diagram.rb 3 Dec 2003 04:20:22 -0000 1.2 +++ lib/rdoc/diagram.rb 1 Mar 2004 18:51:40 -0000 @@ -296,5 +296,5 @@ module RDoc end - system "dot -T#{op_type} #{src} -o #{dot}" + system "dot", "-T#{op_type}", src, "-o", dot # Now construct the imagemap wrapper around Index: lib/rdoc/generators/chm_generator.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/rdoc/generators/chm_generator.rb,v retrieving revision 1.1 diff -u -2 -p -d -r1.1 chm_generator.rb --- lib/rdoc/generators/chm_generator.rb 1 Dec 2003 07:12:48 -0000 1.1 +++ lib/rdoc/generators/chm_generator.rb 1 Mar 2004 18:52:42 -0000 @@ -5,5 +5,5 @@ module Generators class CHMGenerator < HTMLGenerator - HHC_PATH = "c:\\Program Files\\HTML Help Workshop\\hhc.exe" + HHC_PATH = "c:/Program Files/HTML Help Workshop/hhc.exe" # Standard generator factory @@ -104,5 +104,5 @@ module Generators # Invoke the windows help compiler to compiler the project def compile_project - system("\"#{HHC_PATH}\" #@project_name") + system(HHC_PATH, @project_name) end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦