diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-17 09:46:30 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-17 09:46:30 +0000 |
commit | 4df965f4ed21353b6e0c89ac8286c64c6266ec04 (patch) | |
tree | 4b093162914c137315602548313be9d72cbac84d /file.c | |
parent | f4d7a34c01256591004bc477c683868ef748f3bd (diff) |
* file.c (rb_str_encode_ospath): when the encoding of the parameter
is ASCII-8BIT, should recognize as filesystem encoding, and convert
to UTF-8 on Windows.
* file.c (realpath_rec): should convert to ospath encoding before
calling lstat().
* file.c (rb_realpath_internal): resolved string should take over
the encoding of base string.
* transcode.c (rb_str_encode): should return new string always.
fixed #3444.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28349 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -191,8 +191,11 @@ rb_str_encode_ospath(VALUE path) if (enc != utf8) path = rb_str_encode(path, rb_enc_from_encoding(utf8), 0, Qnil); } - else if (RSTRING_LEN(path) > 0) - path = rb_str_encode(path, rb_enc_from_encoding(rb_filesystem_encoding()), 0, Qnil); + else if (RSTRING_LEN(path) > 0) { + path = rb_str_dup(path); + rb_enc_associate(path, rb_filesystem_encoding()); + path = rb_str_encode(path, rb_enc_from_encoding(rb_utf8_encoding()), 0, Qnil); + } #endif return path; } @@ -3223,7 +3226,8 @@ realpath_rec(long *prefixlenp, VALUE *resolvedp, char *unresolved, VALUE loopche else { struct stat sbuf; int ret; - ret = lstat(RSTRING_PTR(testpath), &sbuf); + VALUE testpath2 = rb_str_encode_ospath(testpath); + ret = lstat(RSTRING_PTR(testpath2), &sbuf); if (ret == -1) { if (errno == ENOENT) { if (strict || !last || *unresolved_firstsep) @@ -3292,7 +3296,8 @@ rb_realpath_internal(VALUE basedir, VALUE path, int strict) ptr = RSTRING_PTR(unresolved_path); path_names = skiproot(ptr); if (ptr != path_names) { - resolved = rb_str_new(ptr, path_names - ptr); + resolved = rb_enc_str_new(ptr, path_names - ptr, + rb_enc_get(unresolved_path)); goto root_found; } @@ -3300,7 +3305,8 @@ rb_realpath_internal(VALUE basedir, VALUE path, int strict) ptr = RSTRING_PTR(basedir); basedir_names = skiproot(ptr); if (ptr != basedir_names) { - resolved = rb_str_new(ptr, basedir_names - ptr); + resolved = rb_enc_str_new(ptr, basedir_names - ptr, + rb_enc_get(basedir)); goto root_found; } } @@ -3308,7 +3314,7 @@ rb_realpath_internal(VALUE basedir, VALUE path, int strict) curdir = rb_dir_getwd(); ptr = RSTRING_PTR(curdir); curdir_names = skiproot(ptr); - resolved = rb_str_new(ptr, curdir_names - ptr); + resolved = rb_enc_str_new(ptr, curdir_names - ptr, rb_enc_get(curdir)); root_found: prefixptr = RSTRING_PTR(resolved); |