From 3e71a3e715c33841102f13b8d0615ae2ea6a833d Mon Sep 17 00:00:00 2001 From: barneygale Date: Sat, 20 Jan 2024 00:40:06 +0000 Subject: [PATCH] Move validation into _pattern_stack --- Lib/pathlib/__init__.py | 12 ++++++++---- Lib/pathlib/_abc.py | 10 ++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Lib/pathlib/__init__.py b/Lib/pathlib/__init__.py index 7c57aa9387f918..37470ed4e5ff3c 100644 --- a/Lib/pathlib/__init__.py +++ b/Lib/pathlib/__init__.py @@ -472,7 +472,14 @@ def _pattern_stack(self): """Stack of path components, to be used with patterns in glob().""" parts = self._tail.copy() pattern = self._raw_path - if pattern.endswith('**'): + if self.anchor: + raise NotImplementedError("Non-relative patterns are unsupported") + elif not parts: + raise ValueError("Unacceptable pattern: {!r}".format(pattern)) + elif pattern[-1] in (self.pathmod.sep, self.pathmod.altsep): + # GH-65238: pathlib doesn't preserve trailing slash. Add it back. + parts.append('') + elif parts[-1] == '**': # GH-70303: '**' only matches directories. Add trailing slash. warnings.warn( "Pattern ending '**' will match files and directories in a " @@ -480,9 +487,6 @@ def _pattern_stack(self): "directories and remove this warning.", FutureWarning, 4) parts.append('') - elif pattern[-1] in (self.pathmod.sep, self.pathmod.altsep): - # GH-65238: pathlib doesn't preserve trailing slash. Add it back. - parts.append('') parts.reverse() return parts diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py index 810ab54b2bf94e..1a5571332020df 100644 --- a/Lib/pathlib/_abc.py +++ b/Lib/pathlib/_abc.py @@ -430,7 +430,10 @@ def is_absolute(self): @property def _pattern_stack(self): """Stack of path components, to be used with patterns in glob().""" - return self._stack[1] + anchor, parts = self._stack + if anchor: + raise NotImplementedError("Non-relative patterns are unsupported") + return parts def match(self, path_pattern, *, case_sensitive=None): """ @@ -733,11 +736,6 @@ def glob(self, pattern, *, case_sensitive=None, follow_symlinks=None): """ if not isinstance(pattern, PurePathBase): pattern = self.with_segments(pattern) - if pattern.anchor: - raise NotImplementedError("Non-relative patterns are unsupported") - elif not pattern.parts: - raise ValueError("Unacceptable pattern: {!r}".format(pattern)) - if case_sensitive is None: # TODO: evaluate case-sensitivity of each directory in _select_children(). case_sensitive = _is_case_sensitive(self.pathmod)