summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Jones <pjones@devalot.com>2022-03-24 13:48:27 -0700
committergit <svn-admin@ruby-lang.org>2022-06-26 14:40:48 +0900
commite0bfdb23af3f182d7605a6ac3c93b07001d9045c (patch)
tree3fc816a24045a2bb51bab6fb4b5368ca13a44809
parent846a6bb60ff5fe085ce90442a11e0dceadf8a0e9 (diff)
[ruby/irb] Ensure stdout is a TTY before calling winsize
When outputting a (possibly truncated) value, IRB will query the window size. However, if IRB was piped to another process, stdout will no longer be a TTY and will not support the `winsize` method. This fix ensure that stdout is a TTY. https://github.com/ruby/irb/commit/125de5eeea
-rw-r--r--lib/irb/input-method.rb2
-rw-r--r--test/irb/test_context.rb16
2 files changed, 13 insertions, 5 deletions
diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb
index 64276e61be..fd68239ee3 100644
--- a/lib/irb/input-method.rb
+++ b/lib/irb/input-method.rb
@@ -39,7 +39,7 @@ module IRB
public :gets
def winsize
- if instance_variable_defined?(:@stdout)
+ if instance_variable_defined?(:@stdout) && @stdout.tty?
@stdout.winsize
else
[24, 80]
diff --git a/test/irb/test_context.rb b/test/irb/test_context.rb
index 42f82fc37e..ad842c2725 100644
--- a/test/irb/test_context.rb
+++ b/test/irb/test_context.rb
@@ -30,10 +30,6 @@ module TestIRB
def reset
@line_no = 0
end
-
- def winsize
- [10, 20]
- end
end
def setup
@@ -135,6 +131,18 @@ module TestIRB
], out)
end
+ def test_output_to_pipe
+ input = TestInputMethod.new(["n=1"])
+ input.instance_variable_set(:@stdout, StringIO.new)
+ irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input)
+ irb.context.echo_on_assignment = :truncate
+ out, err = capture_output do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal "=> 1\n", out
+ end
+
def test_eval_object_without_inspect_method
verbose, $VERBOSE = $VERBOSE, nil
all_assertions do |all|