mirror of
https://github.com/ruby/ruby.git
synced 2025-09-18 01:54:00 +02:00
merge revision(s) 49528:
dir.c: preserve encoding * dir.c (sys_enc_warning_in): preserve encoding of path name in warning messages. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@49665 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a712ced7cb
commit
e896f10487
3 changed files with 85 additions and 13 deletions
52
dir.c
52
dir.c
|
@ -1081,16 +1081,45 @@ dir_s_rmdir(VALUE obj, VALUE dir)
|
|||
return INT2FIX(0);
|
||||
}
|
||||
|
||||
struct warning_args {
|
||||
#ifdef RUBY_FUNCTION_NAME_STRING
|
||||
const char *func;
|
||||
#endif
|
||||
const char *mesg;
|
||||
rb_encoding *enc;
|
||||
};
|
||||
|
||||
#ifndef RUBY_FUNCTION_NAME_STRING
|
||||
#define sys_enc_warning_in(func, mesg, enc) sys_enc_warning(mesg, enc)
|
||||
#endif
|
||||
|
||||
static VALUE
|
||||
sys_warning_1(VALUE mesg)
|
||||
{
|
||||
rb_sys_warning("%s", (const char *)mesg);
|
||||
const struct warning_args *arg = (struct warning_args *)mesg;
|
||||
#ifdef RUBY_FUNCTION_NAME_STRING
|
||||
rb_sys_enc_warning(arg->enc, "%s: %s", arg->func, arg->mesg);
|
||||
#else
|
||||
rb_sys_enc_warning(arg->enc, "%s", arg->mesg);
|
||||
#endif
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static void
|
||||
sys_enc_warning_in(const char *func, const char *mesg, rb_encoding *enc)
|
||||
{
|
||||
struct warning_args arg;
|
||||
#ifdef RUBY_FUNCTION_NAME_STRING
|
||||
arg.func = func;
|
||||
#endif
|
||||
arg.mesg = mesg;
|
||||
arg.enc = enc;
|
||||
rb_protect(sys_warning_1, (VALUE)&arg, 0);
|
||||
}
|
||||
|
||||
#define GLOB_VERBOSE (1U << (sizeof(int) * CHAR_BIT - 1))
|
||||
#define sys_warning(val) \
|
||||
(void)((flags & GLOB_VERBOSE) && rb_protect(sys_warning_1, (VALUE)(val), 0))
|
||||
#define sys_warning(val, enc) \
|
||||
((flags & GLOB_VERBOSE) ? sys_enc_warning_in(RUBY_FUNCTION_NAME_STRING, (val), (enc)) :(void)0)
|
||||
|
||||
#define GLOB_ALLOC(type) ((type *)malloc(sizeof(type)))
|
||||
#define GLOB_ALLOC_N(type, n) ((type *)malloc(sizeof(type) * (n)))
|
||||
|
@ -1112,23 +1141,22 @@ sys_warning_1(VALUE mesg)
|
|||
|
||||
/* System call with warning */
|
||||
static int
|
||||
do_stat(const char *path, struct stat *pst, int flags)
|
||||
|
||||
do_stat(const char *path, struct stat *pst, int flags, rb_encoding *enc)
|
||||
{
|
||||
int ret = STAT(path, pst);
|
||||
if (ret < 0 && !to_be_ignored(errno))
|
||||
sys_warning(path);
|
||||
sys_warning(path, enc);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined HAVE_LSTAT || defined lstat
|
||||
static int
|
||||
do_lstat(const char *path, struct stat *pst, int flags)
|
||||
do_lstat(const char *path, struct stat *pst, int flags, rb_encoding *enc)
|
||||
{
|
||||
int ret = lstat(path, pst);
|
||||
if (ret < 0 && !to_be_ignored(errno))
|
||||
sys_warning(path);
|
||||
sys_warning(path, enc);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1152,7 +1180,7 @@ do_opendir(const char *path, int flags, rb_encoding *enc)
|
|||
#endif
|
||||
dirp = opendir(path);
|
||||
if (dirp == NULL && !to_be_ignored(errno))
|
||||
sys_warning(path);
|
||||
sys_warning(path, enc);
|
||||
#ifdef _WIN32
|
||||
if (tmp) rb_str_resize(tmp, 0); /* GC guard */
|
||||
#endif
|
||||
|
@ -1551,7 +1579,7 @@ glob_helper(
|
|||
pathlen = strlen(path);
|
||||
if (*path) {
|
||||
if (match_all && exist == UNKNOWN) {
|
||||
if (do_lstat(path, &st, flags) == 0) {
|
||||
if (do_lstat(path, &st, flags, enc) == 0) {
|
||||
exist = YES;
|
||||
isdir = S_ISDIR(st.st_mode) ? YES : S_ISLNK(st.st_mode) ? UNKNOWN : NO;
|
||||
}
|
||||
|
@ -1561,7 +1589,7 @@ glob_helper(
|
|||
}
|
||||
}
|
||||
if (match_dir && isdir == UNKNOWN) {
|
||||
if (do_stat(path, &st, flags) == 0) {
|
||||
if (do_stat(path, &st, flags, enc) == 0) {
|
||||
exist = YES;
|
||||
isdir = S_ISDIR(st.st_mode) ? YES : NO;
|
||||
}
|
||||
|
@ -1663,7 +1691,7 @@ glob_helper(
|
|||
if (recursive && dotfile < ((flags & FNM_DOTMATCH) ? 2 : 1)) {
|
||||
/* RECURSIVE never match dot files unless FNM_DOTMATCH is set */
|
||||
#ifndef _WIN32
|
||||
if (do_lstat(buf, &st, flags) == 0)
|
||||
if (do_lstat(buf, &st, flags, enc) == 0)
|
||||
new_isdir = S_ISDIR(st.st_mode) ? YES : S_ISLNK(st.st_mode) ? UNKNOWN : NO;
|
||||
else
|
||||
new_isdir = NO;
|
||||
|
|
|
@ -303,6 +303,50 @@ class TestDir_M17N < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def with_enc_path
|
||||
with_tmpdir do |d|
|
||||
names = %W"\u{391 392 393 394 395} \u{3042 3044 3046 3048 304a}"
|
||||
names.each do |dir|
|
||||
Dir.mkdir(dir) rescue next
|
||||
begin
|
||||
yield(dir)
|
||||
ensure
|
||||
File.chmod(0700, dir)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_glob_warning_opendir
|
||||
with_enc_path do |dir|
|
||||
open("#{dir}/x", "w") {}
|
||||
File.chmod(0300, dir)
|
||||
assert_warning(/#{dir}/) do
|
||||
Dir.glob("#{dir}/*")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_glob_warning_match_all
|
||||
with_enc_path do |dir|
|
||||
open("#{dir}/x", "w") {}
|
||||
File.chmod(0000, dir)
|
||||
assert_warning(/#{dir}/) do
|
||||
Dir.glob("#{dir}/x")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_glob_warning_match_dir
|
||||
with_enc_path do |dir|
|
||||
Dir.mkdir("#{dir}/x")
|
||||
File.chmod(0000, dir)
|
||||
assert_warning(/#{dir}/) do
|
||||
Dir.glob("#{dir}/x/")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_entries_compose
|
||||
bug7267 = '[ruby-core:48745] [Bug #7267]'
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#define RUBY_VERSION "2.2.0"
|
||||
#define RUBY_RELEASE_DATE "2015-02-20"
|
||||
#define RUBY_PATCHLEVEL 66
|
||||
#define RUBY_PATCHLEVEL 67
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2015
|
||||
#define RUBY_RELEASE_MONTH 2
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue