mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
Issue #28666: Now test.support.rmtree is able to remove unwritable or
unreadable directories.
This commit is contained in:
commit
0e7dbe901c
3 changed files with 56 additions and 12 deletions
|
|
@ -358,7 +358,37 @@ if sys.platform.startswith("win"):
|
|||
else:
|
||||
_unlink = os.unlink
|
||||
_rmdir = os.rmdir
|
||||
_rmtree = shutil.rmtree
|
||||
|
||||
def _rmtree(path):
|
||||
try:
|
||||
shutil.rmtree(path)
|
||||
return
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
def force_run(path, func, *args):
|
||||
try:
|
||||
return func(*args)
|
||||
except OSError as err:
|
||||
if verbose >= 2:
|
||||
print('%s: %s' % (err.__class__.__name__, err))
|
||||
print('re-run %s%r' % (func.__name__, args))
|
||||
os.chmod(path, stat.S_IRWXU)
|
||||
return func(*args)
|
||||
def _rmtree_inner(path):
|
||||
for name in force_run(path, os.listdir, path):
|
||||
fullname = os.path.join(path, name)
|
||||
try:
|
||||
mode = os.lstat(fullname).st_mode
|
||||
except OSError:
|
||||
mode = 0
|
||||
if stat.S_ISDIR(mode):
|
||||
_rmtree_inner(fullname)
|
||||
force_run(path, os.rmdir, fullname)
|
||||
else:
|
||||
force_run(path, os.unlink, fullname)
|
||||
_rmtree_inner(path)
|
||||
os.rmdir(path)
|
||||
|
||||
def unlink(filename):
|
||||
try:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue