summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2023-07-03 20:29:44 (GMT)
committerGitHub <noreply@github.com>2023-07-03 20:29:44 (GMT)
commitb4efdf8cda8fbbd0ca53b457d5f6e46a59348caf (patch)
treea2dc7f0ed835a461a243fb3a1adc2855c40a8c9f
parente5862113dde7a66b08f1ece542a3cfaf0a3d9080 (diff)
downloadcpython-b4efdf8cda8fbbd0ca53b457d5f6e46a59348caf.zip
cpython-b4efdf8cda8fbbd0ca53b457d5f6e46a59348caf.tar.gz
cpython-b4efdf8cda8fbbd0ca53b457d5f6e46a59348caf.tar.bz2
GH-106330: Fix matching of empty path in `pathlib.PurePath.match()` (GH-106331)
We match paths using the `_lines` attribute, which is derived from the path's string representation. The bug arises because an empty path's string representation is `'.'` (not `''`), which is matched by the `'*'` wildcard.
-rw-r--r--Lib/pathlib.py8
-rw-r--r--Lib/test/test_pathlib.py4
-rw-r--r--Misc/NEWS.d/next/Library/2023-07-02-10-56-41.gh-issue-106330.QSkIUH.rst2
3 files changed, 12 insertions, 2 deletions
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index e15718d..f3813e0 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -463,8 +463,12 @@ class PurePath:
try:
return self._lines_cached
except AttributeError:
- trans = _SWAP_SEP_AND_NEWLINE[self._flavour.sep]
- self._lines_cached = str(self).translate(trans)
+ path_str = str(self)
+ if path_str == '.':
+ self._lines_cached = ''
+ else:
+ trans = _SWAP_SEP_AND_NEWLINE[self._flavour.sep]
+ self._lines_cached = path_str.translate(trans)
return self._lines_cached
def __eq__(self, other):
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index 464a835..eb2b0cf 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -384,6 +384,10 @@ class PurePathTest(unittest.TestCase):
self.assertTrue(P('A.py').match('a.PY', case_sensitive=False))
self.assertFalse(P('c:/a/B.Py').match('C:/A/*.pY', case_sensitive=True))
self.assertTrue(P('/a/b/c.py').match('/A/*/*.Py', case_sensitive=False))
+ # Matching against empty path
+ self.assertFalse(P().match('*'))
+ self.assertTrue(P().match('**'))
+ self.assertFalse(P().match('**/*'))
def test_ordering_common(self):
# Ordering is tuple-alike.
diff --git a/Misc/NEWS.d/next/Library/2023-07-02-10-56-41.gh-issue-106330.QSkIUH.rst b/Misc/NEWS.d/next/Library/2023-07-02-10-56-41.gh-issue-106330.QSkIUH.rst
new file mode 100644
index 0000000..c1f55ab
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-07-02-10-56-41.gh-issue-106330.QSkIUH.rst
@@ -0,0 +1,2 @@
+Fix incorrect matching of empty paths in :meth:`pathlib.PurePath.match`.
+This bug was introduced in Python 3.12.0 beta 1.