зеркало из https://github.com/github/ruby.git
io.c: fix non-ascii filename inplace edit
* io.c (argf_next_argv): convert filename to the OS encoding to be dealt with by system calls. [ruby-dev:50607] [Bug #14970] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64243 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
775a40f7d6
Коммит
14ad644d84
2
io.c
2
io.c
|
@ -8502,6 +8502,7 @@ argf_next_argv(VALUE argf)
|
|||
VALUE filename = rb_ary_shift(ARGF.argv);
|
||||
FilePathValue(filename);
|
||||
ARGF.filename = filename;
|
||||
filename = rb_str_encode_ospath(filename);
|
||||
fn = StringValueCStr(filename);
|
||||
if (RSTRING_LEN(filename) == 1 && fn[0] == '-') {
|
||||
ARGF.current_file = rb_stdin;
|
||||
|
@ -8603,6 +8604,7 @@ argf_next_argv(VALUE argf)
|
|||
if (!NIL_P(write_io)) {
|
||||
rb_io_set_write_io(ARGF.current_file, write_io);
|
||||
}
|
||||
RB_GC_GUARD(filename);
|
||||
}
|
||||
if (ARGF.binmode) rb_io_ascii8bit_binmode(ARGF.current_file);
|
||||
GetOpenFile(ARGF.current_file, fptr);
|
||||
|
|
|
@ -35,8 +35,8 @@ class TestArgf < Test::Unit::TestCase
|
|||
open("#{@tmpdir}/#{basename}-#{@tmp_count}", "w")
|
||||
end
|
||||
|
||||
def make_tempfile
|
||||
t = make_tempfile0("argf-qux")
|
||||
def make_tempfile(basename = "argf-qux")
|
||||
t = make_tempfile0(basename)
|
||||
t.puts "foo"
|
||||
t.puts "bar"
|
||||
t.puts "baz"
|
||||
|
@ -255,6 +255,23 @@ class TestArgf < Test::Unit::TestCase
|
|||
assert_warning(/#{base}/) {argf.gets}
|
||||
end
|
||||
|
||||
def test_inplace_nonascii
|
||||
ext = Encoding.default_external or
|
||||
skip "no default external encoding"
|
||||
t = nil
|
||||
["\u{3042}", "\u{e9}"].any? {|n| t = make_tempfile(n.encode(ext))} or
|
||||
skip "no name to test"
|
||||
assert_in_out_err(["-i.bak", "-", t.path],
|
||||
"#{<<~"{#"}\n#{<<~'};'}")
|
||||
{#
|
||||
puts ARGF.gets.chomp + '.new'
|
||||
puts ARGF.gets.chomp + '.new'
|
||||
puts ARGF.gets.chomp + '.new'
|
||||
};
|
||||
assert_equal("foo.new\n""bar.new\n""baz.new\n", File.read(t.path))
|
||||
assert_equal("foo\n""bar\n""baz\n", File.read(t.path + ".bak"))
|
||||
end
|
||||
|
||||
def test_inplace_no_backup
|
||||
t = make_tempfile
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче