diff options
author | Guido van Rossum <guido@python.org> | 2016-01-06 17:42:07 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2016-01-06 17:42:07 (GMT) |
commit | 6c2d33a258bb62bc74be4d848968c99c6fbfbba4 (patch) | |
tree | 13015bfdc7364308ecca55890323d23f203ceec0 /Lib/pathlib.py | |
parent | 114a1d638ecd9dc78cf6514c49e5b46213d3a5cd (diff) | |
download | cpython-6c2d33a258bb62bc74be4d848968c99c6fbfbba4.zip cpython-6c2d33a258bb62bc74be4d848968c99c6fbfbba4.tar.gz cpython-6c2d33a258bb62bc74be4d848968c99c6fbfbba4.tar.bz2 |
Issue #24120: Ignore PermissionError in pathlib.Path.[r]glob(). Ulrich Petri.
Diffstat (limited to 'Lib/pathlib.py')
-rw-r--r-- | Lib/pathlib.py | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 918ac8d..b3303b6 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -454,12 +454,15 @@ class _PreciseSelector(_Selector): _Selector.__init__(self, child_parts) def _select_from(self, parent_path, is_dir, exists, listdir): - if not is_dir(parent_path): + try: + if not is_dir(parent_path): + return + path = parent_path._make_child_relpath(self.name) + if exists(path): + for p in self.successor._select_from(path, is_dir, exists, listdir): + yield p + except PermissionError: return - path = parent_path._make_child_relpath(self.name) - if exists(path): - for p in self.successor._select_from(path, is_dir, exists, listdir): - yield p class _WildcardSelector(_Selector): @@ -469,15 +472,19 @@ class _WildcardSelector(_Selector): _Selector.__init__(self, child_parts) def _select_from(self, parent_path, is_dir, exists, listdir): - if not is_dir(parent_path): + try: + if not is_dir(parent_path): + return + cf = parent_path._flavour.casefold + for name in listdir(parent_path): + casefolded = cf(name) + if self.pat.match(casefolded): + path = parent_path._make_child_relpath(name) + for p in self.successor._select_from(path, is_dir, exists, listdir): + yield p + except PermissionError: return - cf = parent_path._flavour.casefold - for name in listdir(parent_path): - casefolded = cf(name) - if self.pat.match(casefolded): - path = parent_path._make_child_relpath(name) - for p in self.successor._select_from(path, is_dir, exists, listdir): - yield p + class _RecursiveWildcardSelector(_Selector): @@ -494,19 +501,22 @@ class _RecursiveWildcardSelector(_Selector): yield p def _select_from(self, parent_path, is_dir, exists, listdir): - if not is_dir(parent_path): + try: + if not is_dir(parent_path): + return + with _cached(listdir) as listdir: + yielded = set() + try: + successor_select = self.successor._select_from + for starting_point in self._iterate_directories(parent_path, is_dir, listdir): + for p in successor_select(starting_point, is_dir, exists, listdir): + if p not in yielded: + yield p + yielded.add(p) + finally: + yielded.clear() + except PermissionError: return - with _cached(listdir) as listdir: - yielded = set() - try: - successor_select = self.successor._select_from - for starting_point in self._iterate_directories(parent_path, is_dir, listdir): - for p in successor_select(starting_point, is_dir, exists, listdir): - if p not in yielded: - yield p - yielded.add(p) - finally: - yielded.clear() # |