[pypy-commit] pypy default: test, fix for os.move, os.replace mixing unicode and ascii file names on win32
mattip
pypy.commits at gmail.com
Sun Mar 4 16:26:01 EST 2018
Author: Matti Picus <matti.picus at gmail.com>
Branch:
Changeset: r93952:8b47f49b6df4
Date: 2018-03-04 13:25 -0800
http://bitbucket.org/pypy/pypy/changeset/8b47f49b6df4/
Log: test, fix for os.move, os.replace mixing unicode and ascii file
names on win32
diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -1175,6 +1175,19 @@
if len(e.value.args) > 2:
assert e.value.args[2] == "\\foo\\bar\\baz"
+ def test_rename(self):
+ os = self.posix
+ with open(self.path, "w") as f:
+ f.write("this is a rename test")
+ unicode_name = str(self.udir) + u'/test\u03be.txt'
+ os.rename(self.path, unicode_name)
+ with open(unicode_name) as f:
+ assert f.read() == 'this is a rename test'
+ os.rename(unicode_name, self.path)
+ with open(self.path) as f:
+ assert f.read() == 'this is a rename test'
+
+
class AppTestEnvironment(object):
def setup_class(cls):
diff --git a/rpython/rlib/_os_support.py b/rpython/rlib/_os_support.py
--- a/rpython/rlib/_os_support.py
+++ b/rpython/rlib/_os_support.py
@@ -99,6 +99,13 @@
return unicode_traits
else:
return string_traits
+
+ @specialize.argtype(0, 1)
+ def _preferred_traits2(path1, path2):
+ if _prefer_unicode(path1) or _prefer_unicode(path2):
+ return unicode_traits
+ else:
+ return string_traits
else:
@specialize.argtype(0)
def _prefer_unicode(path):
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -8,7 +8,7 @@
from rpython.rlib import debug, jit, rstring, rthread, types
from rpython.rlib._os_support import (
_CYGWIN, _MACRO_ON_POSIX, UNDERSCORE_ON_WIN32, _WIN32,
- _prefer_unicode, _preferred_traits)
+ _prefer_unicode, _preferred_traits, _preferred_traits2)
from rpython.rlib.objectmodel import (
specialize, enforceargs, register_replacement_for, NOT_CONSTANT)
from rpython.rlib.rarithmetic import intmask, widen
@@ -1257,7 +1257,7 @@
handle_posix_error('rename',
c_rename(_as_bytes0(path1), _as_bytes0(path2)))
else:
- traits = _preferred_traits(path1)
+ traits = _preferred_traits2(path1, path2)
win32traits = make_win32_traits(traits)
path1 = traits.as_str0(path1)
path2 = traits.as_str0(path2)
@@ -1267,7 +1267,7 @@
@specialize.argtype(0, 1)
def replace(path1, path2):
if _WIN32:
- traits = _preferred_traits(path1)
+ traits = _preferred_traits2(path1, path2)
win32traits = make_win32_traits(traits)
path1 = traits.as_str0(path1)
path2 = traits.as_str0(path2)
More information about the pypy-commit
mailing list