Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
77d1a10f
Commit
77d1a10f
authored
Jan 06, 2016
by
Guido van Rossum
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #24120: Ignore PermissionError in pathlib.Path.[r]glob(). Ulrich Petri.
parent
cf5e8722
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
59 additions
and
37 deletions
+59
-37
Lib/pathlib.py
Lib/pathlib.py
+35
-25
Lib/test/test_pathlib.py
Lib/test/test_pathlib.py
+20
-12
Misc/ACKS
Misc/ACKS
+1
-0
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/pathlib.py
View file @
77d1a10f
...
...
@@ -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
()
#
...
...
Lib/test/test_pathlib.py
View file @
77d1a10f
...
...
@@ -1203,26 +1203,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
# |-- linkA ->
"fileA"
#
|-- linkB -> "dirB"
# |-- linkA ->
fileA
#
`-- linkB -> dirB
#
def
setUp
(
self
):
def
cleanup
():
os
.
chmod
(
join
(
'dirE'
),
0o777
)
support
.
rmtree
(
BASE
)
self
.
addCleanup
(
cleanup
)
os
.
mkdir
(
BASE
)
self
.
addCleanup
(
support
.
rmtree
,
BASE
)
os
.
mkdir
(
join
(
'dirA'
))
os
.
mkdir
(
join
(
'dirB'
))
os
.
mkdir
(
join
(
'dirC'
))
os
.
mkdir
(
join
(
'dirC'
,
'dirD'
))
os
.
mkdir
(
join
(
'dirE'
))
with
open
(
join
(
'fileA'
),
'wb'
)
as
f
:
f
.
write
(
b"this is file A
\
n
"
)
with
open
(
join
(
'dirB'
,
'fileB'
),
'wb'
)
as
f
:
...
...
@@ -1231,6 +1238,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
)
if
not
symlink_skip_reason
:
# Relative symlinks
os
.
symlink
(
'fileA'
,
join
(
'linkA'
))
...
...
@@ -1306,7 +1314,7 @@ class _BasePathTest(object):
p
=
P
(
BASE
)
it
=
p
.
iterdir
()
paths
=
set
(
it
)
expected
=
[
'dirA'
,
'dirB'
,
'dirC'
,
'fileA'
]
expected
=
[
'dirA'
,
'dirB'
,
'dirC'
,
'
dirE'
,
'
fileA'
]
if
not
symlink_skip_reason
:
expected
+=
[
'linkA'
,
'linkB'
,
'brokenLink'
]
self
.
assertEqual
(
paths
,
{
P
(
BASE
,
q
)
for
q
in
expected
})
...
...
Misc/ACKS
View file @
77d1a10f
...
...
@@ -1075,6 +1075,7 @@ Gabriel de Perthuis
Tim Peters
Benjamin Peterson
Joe Peterson
Ulrich Petri
Chris Petrilli
Roumen Petrov
Bjorn Pettersen
...
...
Misc/NEWS
View file @
77d1a10f
...
...
@@ -13,6 +13,9 @@ Core and Builtins
Library
-------
- Issue #24120: Ignore PermissionError when traversing a tree with
pathlib.Path.[r]glob(). Patch by Ulrich Petri.
What'
s
New
in
Python
3.4.4
?
===========================
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment