ruby-changes:49035
From: k0kubun <ko1@a...>
Date: Tue, 12 Dec 2017 20:25:22 +0900 (JST)
Subject: [ruby-changes:49035] k0kubun:r61149 (trunk): irb.rb: preserve ARGV on binding.irb
k0kubun 2017-12-12 20:25:16 +0900 (Tue, 12 Dec 2017) New Revision: 61149 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=61149 Log: irb.rb: preserve ARGV on binding.irb This is not perfectly good solution (at least we don't want to have ARGV as default value of `argv` argument), but unfortunately IRB.setup and IRB.parse_opts are public methods and we can't make breaking change to those methods. We may deprecate using them and then make them private in the future, but the removal should not be in Ruby 2.5. So I kept their interface for now. [Bug #14162] [close GH-1770] Added files: trunk/test/irb/test_init.rb Modified files: trunk/lib/irb/init.rb trunk/lib/irb.rb Index: lib/irb/init.rb =================================================================== --- lib/irb/init.rb (revision 61148) +++ lib/irb/init.rb (revision 61149) @@ -13,10 +13,10 @@ https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L13 module IRB # :nodoc: # initialize config - def IRB.setup(ap_path) + def IRB.setup(ap_path, argv: ARGV) IRB.init_config(ap_path) IRB.init_error - IRB.parse_opts + IRB.parse_opts(argv: argv) IRB.run_config IRB.load_modules @@ -121,9 +121,9 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L121 end # option analyzing - def IRB.parse_opts + def IRB.parse_opts(argv: ARGV) load_path = [] - while opt = ARGV.shift + while opt = argv.shift case opt when "-f" @CONF[:RC] = false @@ -133,7 +133,7 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L133 when "-w" $VERBOSE = true when /^-W(.+)?/ - opt = $1 || ARGV.shift + opt = $1 || argv.shift case opt when "0" $VERBOSE = nil @@ -143,19 +143,19 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L143 $VERBOSE = true end when /^-r(.+)?/ - opt = $1 || ARGV.shift + opt = $1 || argv.shift @CONF[:LOAD_MODULES].push opt if opt when /^-I(.+)?/ - opt = $1 || ARGV.shift + opt = $1 || argv.shift load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt when '-U' set_encoding("UTF-8", "UTF-8") when /^-E(.+)?/, /^--encoding(?:=(.+))?/ - opt = $1 || ARGV.shift + opt = $1 || argv.shift set_encoding(*opt.split(':', 2)) when "--inspect" - if /^-/ !~ ARGV.first - @CONF[:INSPECT_MODE] = ARGV.shift + if /^-/ !~ argv.first + @CONF[:INSPECT_MODE] = argv.shift else @CONF[:INSPECT_MODE] = true end @@ -174,7 +174,7 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L174 when "--noverbose" @CONF[:VERBOSE] = false when /^--prompt-mode(?:=(.+))?/, /^--prompt(?:=(.+))?/ - opt = $1 || ARGV.shift + opt = $1 || argv.shift prompt_mode = opt.upcase.tr("-", "_").intern @CONF[:PROMPT_MODE] = prompt_mode when "--noprompt" @@ -186,13 +186,13 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L186 when "--tracer" @CONF[:USE_TRACER] = true when /^--back-trace-limit(?:=(.+))?/ - @CONF[:BACK_TRACE_LIMIT] = ($1 || ARGV.shift).to_i + @CONF[:BACK_TRACE_LIMIT] = ($1 || argv.shift).to_i when /^--context-mode(?:=(.+))?/ - @CONF[:CONTEXT_MODE] = ($1 || ARGV.shift).to_i + @CONF[:CONTEXT_MODE] = ($1 || argv.shift).to_i when "--single-irb" @CONF[:SINGLE_IRB] = true when /^--irb_debug(?:=(.+))?/ - @CONF[:DEBUG_LEVEL] = ($1 || ARGV.shift).to_i + @CONF[:DEBUG_LEVEL] = ($1 || argv.shift).to_i when "-v", "--version" print IRB.version, "\n" exit 0 @@ -201,7 +201,7 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L201 IRB.print_usage exit 0 when "--" - if opt = ARGV.shift + if opt = argv.shift @CONF[:SCRIPT] = opt $0 = opt end Index: lib/irb.rb =================================================================== --- lib/irb.rb (revision 61148) +++ lib/irb.rb (revision 61149) @@ -704,7 +704,7 @@ end https://github.com/ruby/ruby/blob/trunk/lib/irb.rb#L704 class Binding # :nodoc: def irb - IRB.setup(eval("__FILE__")) + IRB.setup(eval("__FILE__"), argv: []) workspace = IRB::WorkSpace.new(self) STDOUT.print(workspace.code_around_binding) IRB::Irb.new(workspace).run(IRB.conf) Index: test/irb/test_init.rb =================================================================== --- test/irb/test_init.rb (nonexistent) +++ test/irb/test_init.rb (revision 61149) @@ -0,0 +1,25 @@ https://github.com/ruby/ruby/blob/trunk/test/irb/test_init.rb#L1 +# frozen_string_literal: false +require "test/unit" +require "irb" + +module TestIRB + class TestInit < Test::Unit::TestCase + def test_setup_with_argv_preserves_global_argv + argv = ["foo", "bar"] + with_argv(argv) do + IRB.setup(eval("__FILE__"), argv: []) + assert_equal argv, ARGV + end + end + + private + + def with_argv(argv) + orig = ARGV.dup + ARGV.replace(argv) + yield + ensure + ARGV.replace(orig) + end + end +end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/