]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] GH-125069: Fix inconsistent joining in `WindowsPath(PosixPath(...))` (GH-12515...
authorBarney Gale <barney.gale@gmail.com>
Sun, 13 Oct 2024 18:18:41 +0000 (19:18 +0100)
committerGitHub <noreply@github.com>
Sun, 13 Oct 2024 18:18:41 +0000 (18:18 +0000)
`PurePath.__init__()` incorrectly uses the `_raw_paths` of a given
`PurePath` object with a different flavour, even though the procedure to
join path segments can differ between flavours.

This change makes the `_raw_paths`-enabled deferred joining apply _only_
when the path flavours match.

(cherry picked from commit cb8e5995d89d9b90e83cf43310ec50e177484e70)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Lib/pathlib.py
Lib/test/test_pathlib.py
Misc/NEWS.d/next/Library/2024-10-08-21-17-16.gh-issue-125069.0RP0Mx.rst [new file with mode: 0644]

index 65ff0ee1977f801efce81d13beb5c7e351eb364f..02eb5c25981e31b9218de9c21e37de4ad2563ec2 100644 (file)
@@ -359,9 +359,9 @@ class PurePath(object):
         paths = []
         for arg in args:
             if isinstance(arg, PurePath):
-                if arg._flavour is ntpath and self._flavour is posixpath:
+                if arg._flavour is not self._flavour:
                     # GH-103631: Convert separators for backwards compatibility.
-                    paths.extend(path.replace('\\', '/') for path in arg._raw_paths)
+                    paths.append(arg.as_posix())
                 else:
                     paths.extend(arg._raw_paths)
             else:
index ca604df70a9a4ed0ccf57abf5a2950fbc70f3f05..4437f878004c707f0b322e3d7d2e1dd56f639f53 100644 (file)
@@ -831,6 +831,14 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
             ],
     })
 
+    def test_constructor_nested_foreign_flavour(self):
+        # See GH-125069.
+        p1 = pathlib.PurePosixPath('b/c:\\d')
+        p2 = pathlib.PurePosixPath('b/', 'c:\\d')
+        self.assertEqual(p1, p2)
+        self.assertEqual(self.cls(p1), self.cls('b/c:/d'))
+        self.assertEqual(self.cls(p2), self.cls('b/c:/d'))
+
     def test_drive_root_parts(self):
         check = self._check_drive_root_parts
         # First part is anchored.
diff --git a/Misc/NEWS.d/next/Library/2024-10-08-21-17-16.gh-issue-125069.0RP0Mx.rst b/Misc/NEWS.d/next/Library/2024-10-08-21-17-16.gh-issue-125069.0RP0Mx.rst
new file mode 100644 (file)
index 0000000..73d5fa5
--- /dev/null
@@ -0,0 +1,4 @@
+Fix an issue where providing a :class:`pathlib.PurePath` object as an
+initializer argument to a second :class:`~pathlib.PurePath` object with a
+different flavour resulted in arguments to the former object's initializer
+ being joined by the latter object's flavour.