1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
usa 2010-06-17 09:46:30 +00:00
parent f4d7a34c01
commit 4df965f4ed
3 changed files with 33 additions and 7 deletions

View file

@ -1,3 +1,18 @@
Thu Jun 17 18:37:47 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* 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.
Wed Jun 16 15:40:53 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* error.c (rb_bug): existence of _set_abort_behavior() depends on

18
file.c
View file

@ -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);

View file

@ -2805,7 +2805,12 @@ rb_str_encode(VALUE str, VALUE to, int ecflags, VALUE ecopts)
int encidx = str_transcode0(argc, argv, &newstr, ecflags, ecopts);
if (encidx < 0) return rb_str_dup(str);
RBASIC(newstr)->klass = rb_obj_class(str);
if (newstr == str) {
newstr = rb_str_dup(str);
}
else {
RBASIC(newstr)->klass = rb_obj_class(str);
}
return str_encode_associate(newstr, encidx);
}