mirror of
https://github.com/python/cpython.git
synced 2025-08-31 22:18:28 +00:00
Issue #23146: Fix mishandling of absolute Windows paths with forward slashes in pathlib.
Detected and fixed by Serhiy.
This commit is contained in:
commit
2d07b85585
3 changed files with 27 additions and 16 deletions
|
@ -73,6 +73,10 @@ class _Flavour(object):
|
||||||
# parts. This makes the result of parsing e.g.
|
# parts. This makes the result of parsing e.g.
|
||||||
# ("C:", "/", "a") reasonably intuitive.
|
# ("C:", "/", "a") reasonably intuitive.
|
||||||
for part in it:
|
for part in it:
|
||||||
|
if not part:
|
||||||
|
continue
|
||||||
|
if altsep:
|
||||||
|
part = part.replace(altsep, sep)
|
||||||
drv = self.splitroot(part)[0]
|
drv = self.splitroot(part)[0]
|
||||||
if drv:
|
if drv:
|
||||||
break
|
break
|
||||||
|
|
|
@ -102,31 +102,35 @@ class NTFlavourTest(_BaseFlavourTest, unittest.TestCase):
|
||||||
check = self._check_parse_parts
|
check = self._check_parse_parts
|
||||||
# First part is anchored
|
# First part is anchored
|
||||||
check(['c:'], ('c:', '', ['c:']))
|
check(['c:'], ('c:', '', ['c:']))
|
||||||
check(['c:\\'], ('c:', '\\', ['c:\\']))
|
check(['c:/'], ('c:', '\\', ['c:\\']))
|
||||||
check(['\\'], ('', '\\', ['\\']))
|
check(['/'], ('', '\\', ['\\']))
|
||||||
check(['c:a'], ('c:', '', ['c:', 'a']))
|
check(['c:a'], ('c:', '', ['c:', 'a']))
|
||||||
check(['c:\\a'], ('c:', '\\', ['c:\\', 'a']))
|
check(['c:/a'], ('c:', '\\', ['c:\\', 'a']))
|
||||||
check(['\\a'], ('', '\\', ['\\', 'a']))
|
check(['/a'], ('', '\\', ['\\', 'a']))
|
||||||
# UNC paths
|
# UNC paths
|
||||||
check(['\\\\a\\b'], ('\\\\a\\b', '\\', ['\\\\a\\b\\']))
|
check(['//a/b'], ('\\\\a\\b', '\\', ['\\\\a\\b\\']))
|
||||||
check(['\\\\a\\b\\'], ('\\\\a\\b', '\\', ['\\\\a\\b\\']))
|
check(['//a/b/'], ('\\\\a\\b', '\\', ['\\\\a\\b\\']))
|
||||||
check(['\\\\a\\b\\c'], ('\\\\a\\b', '\\', ['\\\\a\\b\\', 'c']))
|
check(['//a/b/c'], ('\\\\a\\b', '\\', ['\\\\a\\b\\', 'c']))
|
||||||
# Second part is anchored, so that the first part is ignored
|
# Second part is anchored, so that the first part is ignored
|
||||||
check(['a', 'Z:b', 'c'], ('Z:', '', ['Z:', 'b', 'c']))
|
check(['a', 'Z:b', 'c'], ('Z:', '', ['Z:', 'b', 'c']))
|
||||||
check(['a', 'Z:\\b', 'c'], ('Z:', '\\', ['Z:\\', 'b', 'c']))
|
check(['a', 'Z:/b', 'c'], ('Z:', '\\', ['Z:\\', 'b', 'c']))
|
||||||
check(['a', '\\b', 'c'], ('', '\\', ['\\', 'b', 'c']))
|
|
||||||
# UNC paths
|
# UNC paths
|
||||||
check(['a', '\\\\b\\c', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd']))
|
check(['a', '//b/c', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd']))
|
||||||
# Collapsing and stripping excess slashes
|
# Collapsing and stripping excess slashes
|
||||||
check(['a', 'Z:\\\\b\\\\c\\', 'd\\'], ('Z:', '\\', ['Z:\\', 'b', 'c', 'd']))
|
check(['a', 'Z://b//c/', 'd/'], ('Z:', '\\', ['Z:\\', 'b', 'c', 'd']))
|
||||||
# UNC paths
|
# UNC paths
|
||||||
check(['a', '\\\\b\\c\\\\', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd']))
|
check(['a', '//b/c//', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd']))
|
||||||
# Extended paths
|
# Extended paths
|
||||||
check(['\\\\?\\c:\\'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\']))
|
check(['//?/c:/'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\']))
|
||||||
check(['\\\\?\\c:\\a'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'a']))
|
check(['//?/c:/a'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'a']))
|
||||||
|
check(['//?/c:/a', '/b'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'b']))
|
||||||
# Extended UNC paths (format is "\\?\UNC\server\share")
|
# Extended UNC paths (format is "\\?\UNC\server\share")
|
||||||
check(['\\\\?\\UNC\\b\\c'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\']))
|
check(['//?/UNC/b/c'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\']))
|
||||||
check(['\\\\?\\UNC\\b\\c\\d'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\', 'd']))
|
check(['//?/UNC/b/c/d'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\', 'd']))
|
||||||
|
# Second part has a root but not drive
|
||||||
|
check(['a', '/b', 'c'], ('', '\\', ['\\', 'b', 'c']))
|
||||||
|
check(['Z:/a', '/b', 'c'], ('Z:', '\\', ['Z:\\', 'b', 'c']))
|
||||||
|
check(['//?/Z:/a', '/b', 'c'], ('\\\\?\\Z:', '\\', ['\\\\?\\Z:\\', 'b', 'c']))
|
||||||
|
|
||||||
def test_splitroot(self):
|
def test_splitroot(self):
|
||||||
f = self.flavour.splitroot
|
f = self.flavour.splitroot
|
||||||
|
|
|
@ -13,6 +13,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #23146: Fix mishandling of absolute Windows paths with forward
|
||||||
|
slashes in pathlib.
|
||||||
|
|
||||||
- Issue #23096: Pickle representation of floats with protocol 0 now is the same
|
- Issue #23096: Pickle representation of floats with protocol 0 now is the same
|
||||||
for both Python and C implementations.
|
for both Python and C implementations.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue