From 7223c0da152114c84e1c4261a282faaea21646fb Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 26 May 2022 12:22:42 -0700 Subject: [PATCH] Do not chomp trailing line separator IO#each with nil separator and chomp nil separator means no sepator, so chomp should not remove a line separator. Partially Fixes [Bug #18770] --- io.c | 1 - spec/ruby/core/io/shared/each.rb | 18 ++++++++++++++---- test/ruby/test_io.rb | 16 +++++++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/io.c b/io.c index 7149013566..a39ab74a4d 100644 --- a/io.c +++ b/io.c @@ -3875,7 +3875,6 @@ rb_io_getline_0(VALUE rs, long limit, int chomp, rb_io_t *fptr) if (NIL_P(rs) && limit < 0) { str = read_all(fptr, 0, Qnil); if (RSTRING_LEN(str) == 0) return Qnil; - if (chomp) rb_str_chomp_string(str, rb_default_rs); } else if (limit == 0) { return rb_enc_str_new(0, 0, io_read_encoding(fptr)); diff --git a/spec/ruby/core/io/shared/each.rb b/spec/ruby/core/io/shared/each.rb index badf8985e0..607e7de03e 100644 --- a/spec/ruby/core/io/shared/each.rb +++ b/spec/ruby/core/io/shared/each.rb @@ -190,10 +190,20 @@ describe :io_each, shared: true do end describe "when passed chomp and nil as a separator" do - it "yields self's content without trailing new line character" do - @io.pos = 100 - @io.send(@method, nil, chomp: true) { |s| ScratchPad << s } - ScratchPad.recorded.should == ["qui a linha cinco.\nHere is line six."] + ruby_version_is "3.2" do + it "yields self's content" do + @io.pos = 100 + @io.send(@method, nil, chomp: true) { |s| ScratchPad << s } + ScratchPad.recorded.should == ["qui a linha cinco.\nHere is line six.\n"] + end + end + + ruby_version_is ""..."3.2" do + it "yields self's content without trailing new line character" do + @io.pos = 100 + @io.send(@method, nil, chomp: true) { |s| ScratchPad << s } + ScratchPad.recorded.should == ["qui a linha cinco.\nHere is line six."] + end end end diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 0f42d8e164..b8530e7400 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -312,7 +312,7 @@ class TestIO < Test::Unit::TestCase w.print "a\n\nb\n\n" w.close end, proc do |r| - assert_equal "a\n\nb\n", r.gets(nil, chomp: true) + assert_equal("a\n\nb\n\n", r.gets(nil, chomp: true), "[Bug #18770]") assert_nil r.gets("") r.close end) @@ -1894,6 +1894,20 @@ class TestIO < Test::Unit::TestCase assert_equal("baz\n", e.next) assert_raise(StopIteration) { e.next } end) + + pipe(proc do |w| + w.write "foo\n" + w.close + end, proc do |r| + assert_equal(["foo\n"], r.each_line(nil, chomp: true).to_a, "[Bug #18770]") + end) + + pipe(proc do |w| + w.write "foo\n" + w.close + end, proc do |r| + assert_equal(["fo", "o\n"], r.each_line(nil, 2, chomp: true).to_a, "[Bug #18770]") + end) end def test_each_byte2