[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