mirror of
https://github.com/python/cpython.git
synced 2025-10-07 07:31:46 +00:00
Issue #24120: Ignore PermissionError in pathlib.Path.[r]glob(). Ulrich Petri.
This commit is contained in:
parent
114a1d638e
commit
6c2d33a258
4 changed files with 59 additions and 37 deletions
|
@ -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()
|
||||
|
||||
|
||||
#
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue