]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-130614: pathlib ABCs: support alternate separator in `full_match()` (#130991)
authorBarney Gale <barney.gale@gmail.com>
Sun, 9 Mar 2025 16:36:59 +0000 (16:36 +0000)
committerGitHub <noreply@github.com>
Sun, 9 Mar 2025 16:36:59 +0000 (16:36 +0000)
In `pathlib.types._JoinablePath.full_match()`, treat alternate path
separators in the path and pattern as if they were primary separators. e.g.
if the parser is `ntpath`, then `P(r'foo/bar\baz').full_match(r'*\*/*')` is
true.

Lib/glob.py
Lib/pathlib/types.py

index d1a6dddeeb1610018b33cd4b7b03fdc04e19dc37..8879eff80415aa8a1d5936b9014dbc60b71bd7d3 100644 (file)
@@ -320,11 +320,11 @@ def translate(pat, *, recursive=False, include_hidden=False, seps=None):
 
 
 @functools.lru_cache(maxsize=512)
-def _compile_pattern(pat, sep, case_sensitive, recursive=True):
+def _compile_pattern(pat, seps, case_sensitive, recursive=True):
     """Compile given glob pattern to a re.Pattern object (observing case
     sensitivity)."""
     flags = re.NOFLAG if case_sensitive else re.IGNORECASE
-    regex = translate(pat, recursive=recursive, include_hidden=True, seps=sep)
+    regex = translate(pat, recursive=recursive, include_hidden=True, seps=seps)
     return re.compile(regex, flags=flags).match
 
 
@@ -360,8 +360,9 @@ class _GlobberBase:
 
     # High-level methods
 
-    def compile(self, pat):
-        return _compile_pattern(pat, self.sep, self.case_sensitive, self.recursive)
+    def compile(self, pat, altsep=None):
+        seps = (self.sep, altsep) if altsep else self.sep
+        return _compile_pattern(pat, seps, self.case_sensitive, self.recursive)
 
     def selector(self, parts):
         """Returns a function that selects from a given path, walking and
index c65e4e3ede90b1b17f541e76f9ce7a0c61faa5d5..67e084c94c6ca4d785894c9c1255a68890903efc 100644 (file)
@@ -14,7 +14,7 @@ from abc import ABC, abstractmethod
 from glob import _PathGlobber, _no_recurse_symlinks
 from pathlib import PurePath, Path
 from pathlib._os import magic_open, ensure_distinct_paths, copy_file
-from typing import Protocol, runtime_checkable
+from typing import Optional, Protocol, runtime_checkable
 
 
 def _explode_path(path):
@@ -44,6 +44,7 @@ class _PathParser(Protocol):
     """
 
     sep: str
+    altsep: Optional[str]
     def split(self, path: str) -> tuple[str, str]: ...
     def splitext(self, path: str) -> tuple[str, str]: ...
     def normcase(self, path: str) -> str: ...
@@ -225,7 +226,7 @@ class _JoinablePath(ABC):
         if case_sensitive is None:
             case_sensitive = self.parser.normcase('Aa') == 'Aa'
         globber = _PathGlobber(pattern.parser.sep, case_sensitive, recursive=True)
-        match = globber.compile(str(pattern))
+        match = globber.compile(str(pattern), altsep=pattern.parser.altsep)
         return match(str(self)) is not None