summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2022-09-17 02:25:15 +0900
committergit <svn-admin@ruby-lang.org>2022-09-17 02:25:26 +0900
commitb07db967441161a84386bcbbb41d990a2f3ad31c (patch)
tree2cc325c7ad264443694dc7287da6cbace9d98fb8
parent64200990c4425ad3d104d4695dbe9cb3356555cd (diff)
downloadruby-b07db967441161a84386bcbbb41d990a2f3ad31c.tar.gz
[ruby/irb] Support --noscript option to not use first non-option argument as script
Also add --script option to turn the option back on. Previously there wasn't a way to get an interactive IRB session and access arguments provided on the command line. Additionally, handle `-` as script as stdin. In Unix-like tools, `-` means to take standard input instead of a file. This doesn't result in exactly the same output for: ``` echo 'p ARGV' > args.rb; irb args.rb a b c ``` and ``` echo 'p ARGV' | irb - a b c ``` Due to how irb handles whether stdin is a tty. However, this change allows use of `-` as a argument, instead of giving an unrecognized switch error. This required some small changes to context.rb (to handle `-` as standard input) and input-method.rb (to have FileInputMethod accept IO arguments in addition to strings). Implements [Feature #15371] https://github.com/ruby/irb/commit/4192683ba2
-rw-r--r--lib/irb/context.rb4
-rw-r--r--lib/irb/init.rb16
-rw-r--r--lib/irb/input-method.rb2
-rw-r--r--lib/irb/lc/help-message2
-rw-r--r--test/irb/test_init.rb45
5 files changed, 64 insertions, 5 deletions
diff --git a/lib/irb/context.rb b/lib/irb/context.rb
index e6c993d423..b74cae1223 100644
--- a/lib/irb/context.rb
+++ b/lib/irb/context.rb
@@ -115,6 +115,10 @@ module IRB
end
@io = StdioInputMethod.new unless @io
+ when '-'
+ @io = FileInputMethod.new($stdin)
+ @irb_name = '-'
+ @irb_path = '-'
when String
@io = FileInputMethod.new(input_method)
@irb_name = File.basename(input_method)
diff --git a/lib/irb/init.rb b/lib/irb/init.rb
index d2baee2017..d9c4353f39 100644
--- a/lib/irb/init.rb
+++ b/lib/irb/init.rb
@@ -289,6 +289,10 @@ module IRB # :nodoc:
@CONF[:PROMPT_MODE] = prompt_mode
when "--noprompt"
@CONF[:PROMPT_MODE] = :NULL
+ when "--script"
+ noscript = false
+ when "--noscript"
+ noscript = true
when "--inf-ruby-mode"
@CONF[:PROMPT_MODE] = :INF_RUBY
when "--sample-book-mode", "--simple-prompt"
@@ -309,16 +313,20 @@ module IRB # :nodoc:
IRB.print_usage
exit 0
when "--"
- if opt = argv.shift
+ if !noscript && (opt = argv.shift)
@CONF[:SCRIPT] = opt
$0 = opt
end
break
- when /^-/
+ when /^-./
fail UnrecognizedSwitch, opt
else
- @CONF[:SCRIPT] = opt
- $0 = opt
+ if noscript
+ argv.unshift(opt)
+ else
+ @CONF[:SCRIPT] = opt
+ $0 = opt
+ end
break
end
end
diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb
index b77fd3207d..eec2daa549 100644
--- a/lib/irb/input-method.rb
+++ b/lib/irb/input-method.rb
@@ -137,7 +137,7 @@ module IRB
# Creates a new input method object
def initialize(file)
super
- @io = IRB::MagicFile.open(file)
+ @io = file.is_a?(IO) ? file : IRB::MagicFile.open(file)
@external_encoding = @io.external_encoding
end
# The file name of this input method, usually given during initialization.
diff --git a/lib/irb/lc/help-message b/lib/irb/lc/help-message
index 3405fa775f..5b23f4c41e 100644
--- a/lib/irb/lc/help-message
+++ b/lib/irb/lc/help-message
@@ -38,6 +38,8 @@ Usage: irb.rb [options] [programfile] [arguments]
--sample-book-mode, --simple-prompt
Set prompt mode to 'simple'.
--noprompt Don't output prompt.
+ --script Script mode (default, treat first argument as script)
+ --noscript No script mode (leave arguments in argv)
--single-irb Share self with sub-irb.
--tracer Show stack trace for each command.
--back-trace-limit n[=16]
diff --git a/test/irb/test_init.rb b/test/irb/test_init.rb
index d8c7c79263..3293b98d34 100644
--- a/test/irb/test_init.rb
+++ b/test/irb/test_init.rb
@@ -16,6 +16,7 @@ module TestIRB
def teardown
ENV.update(@backup_env)
FileUtils.rm_rf(@tmpdir)
+ IRB.conf.delete(:SCRIPT)
end
def test_setup_with_argv_preserves_global_argv
@@ -87,6 +88,50 @@ module TestIRB
IRB.conf[:USE_COLORIZE] = orig_use_colorize
end
+ def test_noscript
+ argv = %w[--noscript -- -f]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_nil IRB.conf[:SCRIPT]
+ assert_equal(['-f'], argv)
+
+ argv = %w[--noscript -- a]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_nil IRB.conf[:SCRIPT]
+ assert_equal(['a'], argv)
+
+ argv = %w[--noscript a]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_nil IRB.conf[:SCRIPT]
+ assert_equal(['a'], argv)
+
+ argv = %w[--script --noscript a]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_nil IRB.conf[:SCRIPT]
+ assert_equal(['a'], argv)
+
+ argv = %w[--noscript --script a]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_equal('a', IRB.conf[:SCRIPT])
+ assert_equal([], argv)
+ end
+
+ def test_dash
+ argv = %w[-]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_equal('-', IRB.conf[:SCRIPT])
+ assert_equal([], argv)
+
+ argv = %w[-- -]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_equal('-', IRB.conf[:SCRIPT])
+ assert_equal([], argv)
+
+ argv = %w[-- - -f]
+ IRB.setup(eval("__FILE__"), argv: argv)
+ assert_equal('-', IRB.conf[:SCRIPT])
+ assert_equal(['-f'], argv)
+ end
+
private
def with_argv(argv)