cpython: 8e2388b1e875 (original) (raw)
Mercurial > cpython
changeset 94597:8e2388b1e875 2.7
Issue #21840: Fixed expanding unicode variables of form $var in posixpath.expandvars(). Fixed all os.path implementations on unicode-disabled builds. [#21840]
Serhiy Storchaka storchaka@gmail.com | |
---|---|
date | Fri, 13 Feb 2015 12:02:05 +0200 |
parents | e55f955659bc |
children | 544c5d4f4084 |
files | Lib/genericpath.py Lib/macpath.py Lib/ntpath.py Lib/os2emxpath.py Lib/posixpath.py Lib/test/test_genericpath.py Lib/test/test_macpath.py Lib/test/test_ntpath.py Lib/test/test_posixpath.py Misc/NEWS |
diffstat | 10 files changed, 52 insertions(+), 23 deletions(-)[+] [-] Lib/genericpath.py 8 Lib/macpath.py 3 Lib/ntpath.py 9 Lib/os2emxpath.py 3 Lib/posixpath.py 21 Lib/test/test_genericpath.py 2 Lib/test/test_macpath.py 1 Lib/test/test_ntpath.py 5 Lib/test/test_posixpath.py 19 Misc/NEWS 4 |
line wrap: on
line diff
--- a/Lib/genericpath.py +++ b/Lib/genericpath.py @@ -10,6 +10,14 @@ import stat 'getsize', 'isdir', 'isfile'] +try:
If Python is built without Unicode support, the unicode type
will not exist. Fake one.
- class _unicode(object):
pass[](#l1.13)
Does a path exist?
This is false for dangling symbolic links on systems that support them.
--- a/Lib/macpath.py +++ b/Lib/macpath.py @@ -5,6 +5,7 @@ import warnings from stat import * import genericpath from genericpath import * +from genericpath import _unicode all = ["normcase","isabs","join","splitdrive","split","splitext", "basename","dirname","commonprefix","getsize","getmtime", @@ -186,7 +187,7 @@ def walk(top, func, arg): def abspath(path): """Return an absolute path.""" if not isabs(path):
if isinstance(path, unicode):[](#l2.15)
if isinstance(path, _unicode):[](#l2.16) cwd = os.getcwdu()[](#l2.17) else:[](#l2.18) cwd = os.getcwd()[](#l2.19)
--- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -12,6 +12,7 @@ import genericpath import warnings from genericpath import * +from genericpath import unicode all = ["normcase","isabs","join","splitdrive","split","splitext", "basename","dirname","commonprefix","getsize","getmtime", @@ -331,7 +332,7 @@ def expandvars(path): return path import string varchars = string.ascii_letters + string.digits + '-'
- if isinstance(path, _unicode): encoding = sys.getfilesystemencoding() def getenv(var): return os.environ[var.encode(encoding)].decode(encoding)
@@ -414,7 +415,7 @@ def expandvars(path): def normpath(path): """Normalize path, eliminating double slashes, etc.""" # Preserve unicode (if path is unicode)
- backslash, dot = (u'\', u'.') if isinstance(path, _unicode) else ('\', '.') if path.startswith(('\\.\', '\\?\')): # in the case of paths with these prefixes: # \.\ -> device names
@@ -471,7 +472,7 @@ except ImportError: # not running on Win def abspath(path): """Return the absolute version of a path.""" if not isabs(path):
if isinstance(path, unicode):[](#l3.33)
if isinstance(path, _unicode):[](#l3.34) cwd = os.getcwdu()[](#l3.35) else:[](#l3.36) cwd = os.getcwd()[](#l3.37)
@@ -487,7 +488,7 @@ else: # use native Windows method on Wi path = _getfullpathname(path) except WindowsError: pass # Bad path - return unchanged.
elif isinstance(path, unicode):[](#l3.42)
elif isinstance(path, _unicode):[](#l3.43) path = os.getcwdu()[](#l3.44) else:[](#l3.45) path = os.getcwd()[](#l3.46)
--- a/Lib/os2emxpath.py +++ b/Lib/os2emxpath.py @@ -8,6 +8,7 @@ module as os.path. import os import stat from genericpath import * +from genericpath import _unicode from ntpath import (expanduser, expandvars, isabs, islink, splitdrive, splitext, split, walk) @@ -146,7 +147,7 @@ def normpath(path): def abspath(path): """Return the absolute version of a path""" if not isabs(path):
if isinstance(path, unicode):[](#l4.15)
if isinstance(path, _unicode):[](#l4.16) cwd = os.getcwdu()[](#l4.17) else:[](#l4.18) cwd = os.getcwd()[](#l4.19)
--- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -16,14 +16,7 @@ import stat import genericpath import warnings from genericpath import * - -try:
If Python is built without Unicode support, the unicode type
will not exist. Fake one.
- class _unicode(object):
pass[](#l5.14)
+from genericpath import _unicode all = ["normcase","isabs","join","splitdrive","split","splitext", "basename","dirname","commonprefix","getsize","getmtime", @@ -294,16 +287,16 @@ def expandvars(path): if '$' not in path: return path if isinstance(path, _unicode):
if not _uvarprog:[](#l5.23)
import re[](#l5.24)
_uvarprog = re.compile(ur'\$(\w+|\{[^}]*\})', re.UNICODE)[](#l5.25)
varprog = _uvarprog[](#l5.26)
encoding = sys.getfilesystemencoding()[](#l5.27)
- else: if not _varprog: import re _varprog = re.compile(r'$(\w+|{[^}]*})') varprog = _varprog
encoding = sys.getfilesystemencoding()[](#l5.33)
- else:
if not _uvarprog:[](#l5.35)
import re[](#l5.36)
_uvarprog = re.compile(_unicode(r'\$(\w+|\{[^}]*\})'), re.UNICODE)[](#l5.37)
i = 0 while True:varprog = _uvarprog[](#l5.38) encoding = None[](#l5.39)
--- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -243,11 +243,13 @@ class CommonTest(GenericTest): def test_realpath(self): self.assertIn("foo", self.pathmodule.realpath("foo"))
- @test_support.requires_unicode def test_normpath_issue5827(self): # Make sure normpath preserves unicode for path in (u'', u'.', u'/', u'\', u'///foo/.//bar//'): self.assertIsInstance(self.pathmodule.normpath(path), unicode)
- @test_support.requires_unicode def test_abspath_issue3426(self): # Check that abspath returns unicode when the arg is unicode # with both ASCII and non-ASCII cwds.
--- a/Lib/test/test_macpath.py +++ b/Lib/test/test_macpath.py @@ -59,6 +59,7 @@ class MacPathTestCase(unittest.TestCase) self.assertEqual(splitext(""), ('', '')) self.assertEqual(splitext("foo.bar.ext"), ('foo.bar', '.ext'))
- @test_support.requires_unicode def test_normpath(self): # Issue 5827: Make sure normpath preserves unicode for path in (u'', u'.', u'/', u'\', u':', u'///foo/.//bar//'):
--- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -69,8 +69,9 @@ class TestNtpath(unittest.TestCase): ('', '\\conky\\mountpoint\foo\bar')) tester('ntpath.splitunc("//conky//mountpoint/foo/bar")', ('', '//conky//mountpoint/foo/bar'))
self.assertEqual(ntpath.splitunc(u'//conky/MOUNTPO\u0130NT/foo/bar'),[](#l8.7)
(u'//conky/MOUNTPO\u0130NT', u'/foo/bar'))[](#l8.8)
if test_support.have_unicode:[](#l8.9)
self.assertEqual(ntpath.splitunc(u'//conky/MOUNTPO%cNT/foo/bar' % 0x0130),[](#l8.10)
(u'//conky/MOUNTPO%cNT' % 0x0130, u'/foo/bar'))[](#l8.11)
def test_split(self): tester('ntpath.split("c:\foo\bar")', ('c:\foo', 'bar'))
--- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -1,7 +1,9 @@ import unittest from test import test_support, test_genericpath -import posixpath, os +import posixpath +import os +import sys from posixpath import realpath, abspath, dirname, basename
An absolute path to a temporary filename for testing. We can't rely on TESTFN
@@ -409,6 +411,21 @@ class PosixPathTest(unittest.TestCase): finally: os.getcwd = real_getcwd
- @test_support.requires_unicode
- def test_expandvars_nonascii_word(self):
encoding = sys.getfilesystemencoding()[](#l9.20)
# Non-ASCII word characters[](#l9.21)
letters = test_support.u(r'\xe6\u0130\u0141\u03c6\u041a\u05d0\u062a\u0e01')[](#l9.22)
uwnonascii = letters.encode(encoding, 'ignore').decode(encoding)[:3][](#l9.23)
swnonascii = uwnonascii.encode(encoding)[](#l9.24)
if not swnonascii:[](#l9.25)
self.skip('Needs non-ASCII word characters')[](#l9.26)
with test_support.EnvironmentVarGuard() as env:[](#l9.27)
env.clear()[](#l9.28)
env[swnonascii] = 'baz' + swnonascii[](#l9.29)
self.assertEqual(posixpath.expandvars(u'$%s bar' % uwnonascii),[](#l9.30)
u'baz%s bar' % uwnonascii)[](#l9.31)
+ class PosixCommonTest(test_genericpath.CommonTest): pathmodule = posixpath
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,10 @@ Core and Builtins Library ------- +- Issue #21840: Fixed expanding unicode variables of form $var in