cpython: f6ae90450a4d (original) (raw)
Mercurial > cpython
changeset 99777:f6ae90450a4d
Issue #24120: Ignore PermissionError in pathlib.Path.[r]glob(). Ulrich Petri. (Merge 3.5->3.6) [#24120]
Guido van Rossum guido@dropbox.com | |
---|---|
date | Wed, 06 Jan 2016 09:53:51 -0800 |
parents | 1118dfcbcc35(current diff)224a026b4ca1(diff) |
children | 36864abbfe02 |
files | Lib/test/test_pathlib.py Misc/ACKS Misc/NEWS |
diffstat | 4 files changed, 59 insertions(+), 37 deletions(-)[+] [-] Lib/pathlib.py 60 Lib/test/test_pathlib.py 32 Misc/ACKS 1 Misc/NEWS 3 |
line wrap: on
line diff
--- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -499,12 +499,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):[](#l1.7)
try:[](#l1.8)
if not is_dir(parent_path):[](#l1.9)
return[](#l1.10)
path = parent_path._make_child_relpath(self.name)[](#l1.11)
if exists(path):[](#l1.12)
for p in self.successor._select_from(path, is_dir, exists, listdir):[](#l1.13)
yield p[](#l1.14)
except PermissionError:[](#l1.15) return[](#l1.16)
path = parent_path._make_child_relpath(self.name)[](#l1.17)
if exists(path):[](#l1.18)
for p in self.successor._select_from(path, is_dir, exists, listdir):[](#l1.19)
yield p[](#l1.20)
class _WildcardSelector(_Selector): @@ -514,15 +517,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):[](#l1.28)
try:[](#l1.29)
if not is_dir(parent_path):[](#l1.30)
return[](#l1.31)
cf = parent_path._flavour.casefold[](#l1.32)
for name in listdir(parent_path):[](#l1.33)
casefolded = cf(name)[](#l1.34)
if self.pat.match(casefolded):[](#l1.35)
path = parent_path._make_child_relpath(name)[](#l1.36)
for p in self.successor._select_from(path, is_dir, exists, listdir):[](#l1.37)
yield p[](#l1.38)
except PermissionError:[](#l1.39) return[](#l1.40)
cf = parent_path._flavour.casefold[](#l1.41)
for name in listdir(parent_path):[](#l1.42)
casefolded = cf(name)[](#l1.43)
if self.pat.match(casefolded):[](#l1.44)
path = parent_path._make_child_relpath(name)[](#l1.45)
for p in self.successor._select_from(path, is_dir, exists, listdir):[](#l1.46)
yield p[](#l1.47)
+ class _RecursiveWildcardSelector(_Selector): @@ -539,19 +546,22 @@ class _RecursiveWildcardSelector(_Select yield p def _select_from(self, parent_path, is_dir, exists, listdir):
if not is_dir(parent_path):[](#l1.56)
try:[](#l1.57)
if not is_dir(parent_path):[](#l1.58)
return[](#l1.59)
with _cached(listdir) as listdir:[](#l1.60)
yielded = set()[](#l1.61)
try:[](#l1.62)
successor_select = self.successor._select_from[](#l1.63)
for starting_point in self._iterate_directories(parent_path, is_dir, listdir):[](#l1.64)
for p in successor_select(starting_point, is_dir, exists, listdir):[](#l1.65)
if p not in yielded:[](#l1.66)
yield p[](#l1.67)
yielded.add(p)[](#l1.68)
finally:[](#l1.69)
yielded.clear()[](#l1.70)
except PermissionError:[](#l1.71) return[](#l1.72)
with _cached(listdir) as listdir:[](#l1.73)
yielded = set()[](#l1.74)
try:[](#l1.75)
successor_select = self.successor._select_from[](#l1.76)
for starting_point in self._iterate_directories(parent_path, is_dir, listdir):[](#l1.77)
for p in successor_select(starting_point, is_dir, exists, listdir):[](#l1.78)
if p not in yielded:[](#l1.79)
yield p[](#l1.80)
yielded.add(p)[](#l1.81)
finally:[](#l1.82)
yielded.clear()[](#l1.83)
--- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1199,26 +1199,33 @@ class _BasePathTest(object): # (BASE) # |
|-- dirA/
|-- linkC -> "../dirB"
|-- dirB/
| |-- fileB
|-- linkD -> "../dirB"
|-- dirC/
| |-- fileC
| |-- fileD
|-- brokenLink -> non-existing
|-- dirA
| `-- linkC -> ../dirB
|-- dirB
| |-- fileB
| `-- linkD -> ../dirB
|-- dirC
| |-- dirD
| | `-- fileD
| `-- fileC
|-- dirE
|-- fileA
def cleanup():[](#l2.34)
os.chmod(join('dirE'), 0o777)[](#l2.35)
support.rmtree(BASE)[](#l2.36)
self.addCleanup(cleanup)[](#l2.37) os.mkdir(BASE)[](#l2.38)
self.addCleanup(support.rmtree, BASE)[](#l2.39) os.mkdir(join('dirA'))[](#l2.40) os.mkdir(join('dirB'))[](#l2.41) os.mkdir(join('dirC'))[](#l2.42) os.mkdir(join('dirC', 'dirD'))[](#l2.43)
os.mkdir(join('dirE'))[](#l2.44) with open(join('fileA'), 'wb') as f:[](#l2.45) f.write(b"this is file A\n")[](#l2.46) with open(join('dirB', 'fileB'), 'wb') as f:[](#l2.47)
@@ -1227,6 +1234,7 @@ class _BasePathTest(object): f.write(b"this is file C\n") with open(join('dirC', 'dirD', 'fileD'), 'wb') as f: f.write(b"this is file D\n")
os.chmod(join('dirE'), 0)[](#l2.52) if not symlink_skip_reason:[](#l2.53) # Relative symlinks[](#l2.54) os.symlink('fileA', join('linkA'))[](#l2.55)
@@ -1363,7 +1371,7 @@ class _BasePathTest(object): p = P(BASE) it = p.iterdir() paths = set(it)
expected = ['dirA', 'dirB', 'dirC', 'fileA'][](#l2.60)
expected = ['dirA', 'dirB', 'dirC', 'dirE', 'fileA'][](#l2.61) if not symlink_skip_reason:[](#l2.62) expected += ['linkA', 'linkB', 'brokenLink'][](#l2.63) self.assertEqual(paths, { P(BASE, q) for q in expected })[](#l2.64)
--- a/Misc/ACKS +++ b/Misc/ACKS @@ -1110,6 +1110,7 @@ Gabriel de Perthuis Tim Peters Benjamin Peterson Joe Peterson +Ulrich Petri Chris Petrilli Roumen Petrov Bjorn Pettersen
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -128,6 +128,9 @@ Core and Builtins Library ------- +- Issue #24120: Ignore PermissionError when traversing a tree with