mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #19908: pathlib now joins relative Windows paths correctly when a drive
is present. Original patch by Antoine Pitrou.
This commit is contained in:
parent
1b8b868b84
commit
a993902a28
3 changed files with 53 additions and 5 deletions
|
@ -89,12 +89,16 @@ class _Flavour(object):
|
||||||
(drive, root, parts) tuples. Return a new (drive, root, parts) tuple.
|
(drive, root, parts) tuples. Return a new (drive, root, parts) tuple.
|
||||||
"""
|
"""
|
||||||
if root2:
|
if root2:
|
||||||
parts = parts2
|
if not drv2 and drv:
|
||||||
root = root2
|
return drv, root2, [drv + root2] + parts2[1:]
|
||||||
|
elif drv2:
|
||||||
|
if drv2 == drv or self.casefold(drv2) == self.casefold(drv):
|
||||||
|
# Same drive => second path is relative to the first
|
||||||
|
return drv, root, parts + parts2[1:]
|
||||||
else:
|
else:
|
||||||
parts = parts + parts2
|
# Second path is non-anchored (common case)
|
||||||
# XXX raise error if drv and drv2 are different?
|
return drv, root, parts + parts2
|
||||||
return drv2 or drv, root, parts
|
return drv2, root2, parts2
|
||||||
|
|
||||||
|
|
||||||
class _WindowsFlavour(_Flavour):
|
class _WindowsFlavour(_Flavour):
|
||||||
|
|
|
@ -975,6 +975,48 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
|
||||||
self.assertTrue(P('//a/b/c').is_absolute())
|
self.assertTrue(P('//a/b/c').is_absolute())
|
||||||
self.assertTrue(P('//a/b/c/d').is_absolute())
|
self.assertTrue(P('//a/b/c/d').is_absolute())
|
||||||
|
|
||||||
|
def test_join(self):
|
||||||
|
P = self.cls
|
||||||
|
p = P('C:/a/b')
|
||||||
|
pp = p.joinpath('x/y')
|
||||||
|
self.assertEqual(pp, P('C:/a/b/x/y'))
|
||||||
|
pp = p.joinpath('/x/y')
|
||||||
|
self.assertEqual(pp, P('C:/x/y'))
|
||||||
|
# Joining with a different drive => the first path is ignored, even
|
||||||
|
# if the second path is relative.
|
||||||
|
pp = p.joinpath('D:x/y')
|
||||||
|
self.assertEqual(pp, P('D:x/y'))
|
||||||
|
pp = p.joinpath('D:/x/y')
|
||||||
|
self.assertEqual(pp, P('D:/x/y'))
|
||||||
|
pp = p.joinpath('//host/share/x/y')
|
||||||
|
self.assertEqual(pp, P('//host/share/x/y'))
|
||||||
|
# Joining with the same drive => the first path is appended to if
|
||||||
|
# the second path is relative.
|
||||||
|
pp = p.joinpath('c:x/y')
|
||||||
|
self.assertEqual(pp, P('C:/a/b/x/y'))
|
||||||
|
pp = p.joinpath('c:/x/y')
|
||||||
|
self.assertEqual(pp, P('C:/x/y'))
|
||||||
|
|
||||||
|
def test_div(self):
|
||||||
|
# Basically the same as joinpath()
|
||||||
|
P = self.cls
|
||||||
|
p = P('C:/a/b')
|
||||||
|
self.assertEqual(p / 'x/y', P('C:/a/b/x/y'))
|
||||||
|
self.assertEqual(p / 'x' / 'y', P('C:/a/b/x/y'))
|
||||||
|
self.assertEqual(p / '/x/y', P('C:/x/y'))
|
||||||
|
self.assertEqual(p / '/x' / 'y', P('C:/x/y'))
|
||||||
|
# Joining with a different drive => the first path is ignored, even
|
||||||
|
# if the second path is relative.
|
||||||
|
self.assertEqual(p / 'D:x/y', P('D:x/y'))
|
||||||
|
self.assertEqual(p / 'D:' / 'x/y', P('D:x/y'))
|
||||||
|
self.assertEqual(p / 'D:/x/y', P('D:/x/y'))
|
||||||
|
self.assertEqual(p / 'D:' / '/x/y', P('D:/x/y'))
|
||||||
|
self.assertEqual(p / '//host/share/x/y', P('//host/share/x/y'))
|
||||||
|
# Joining with the same drive => the first path is appended to if
|
||||||
|
# the second path is relative.
|
||||||
|
self.assertEqual(p / 'C:x/y', P('C:/a/b/x/y'))
|
||||||
|
self.assertEqual(p / 'C:/x/y', P('C:/x/y'))
|
||||||
|
|
||||||
def test_is_reserved(self):
|
def test_is_reserved(self):
|
||||||
P = self.cls
|
P = self.cls
|
||||||
self.assertIs(False, P('').is_reserved())
|
self.assertIs(False, P('').is_reserved())
|
||||||
|
|
|
@ -18,6 +18,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #19908: pathlib now joins relative Windows paths correctly when a drive
|
||||||
|
is present. Original patch by Antoine Pitrou.
|
||||||
|
|
||||||
- Issue #19296: Silence compiler warning in dbm_open
|
- Issue #19296: Silence compiler warning in dbm_open
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue