summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-11-20 15:42:58 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-11-20 15:42:58 (GMT)
commitba7eb8da099b32247f1cd93b1a92637a35e2f15c (patch)
tree0b682a910acf6f1fcb706c93d4fed1f9d5600932 /Lib
parent01452af645d6b6465a8a2bcedec042848af14104 (diff)
parent2ccb98800af87505d94a6f3b2bec6a97d200bb3a (diff)
downloadcpython-ba7eb8da099b32247f1cd93b1a92637a35e2f15c.zip
cpython-ba7eb8da099b32247f1cd93b1a92637a35e2f15c.tar.gz
cpython-ba7eb8da099b32247f1cd93b1a92637a35e2f15c.tar.bz2
Issue #28666: Now test.support.rmtree is able to remove unwritable or
unreadable directories on Windows too.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/support/__init__.py31
1 files changed, 16 insertions, 15 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 503ae2d..22d8bd6 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -298,6 +298,16 @@ def unload(name):
except KeyError:
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)
+
if sys.platform.startswith("win"):
def _waitfor(func, pathname, waitall=False):
# Perform the operation
@@ -340,7 +350,7 @@ if sys.platform.startswith("win"):
def _rmtree(path):
def _rmtree_inner(path):
- for name in os.listdir(path):
+ for name in _force_run(path, os.listdir, path):
fullname = os.path.join(path, name)
try:
mode = os.lstat(fullname).st_mode
@@ -350,9 +360,9 @@ if sys.platform.startswith("win"):
mode = 0
if stat.S_ISDIR(mode):
_waitfor(_rmtree_inner, fullname, waitall=True)
- os.rmdir(fullname)
+ _force_run(path, os.rmdir, fullname)
else:
- os.unlink(fullname)
+ _force_run(path, os.unlink, fullname)
_waitfor(_rmtree_inner, path, waitall=True)
_waitfor(os.rmdir, path)
else:
@@ -366,17 +376,8 @@ else:
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):
+ for name in _force_run(path, os.listdir, path):
fullname = os.path.join(path, name)
try:
mode = os.lstat(fullname).st_mode
@@ -384,9 +385,9 @@ else:
mode = 0
if stat.S_ISDIR(mode):
_rmtree_inner(fullname)
- force_run(path, os.rmdir, fullname)
+ _force_run(path, os.rmdir, fullname)
else:
- force_run(path, os.unlink, fullname)
+ _force_run(path, os.unlink, fullname)
_rmtree_inner(path)
os.rmdir(path)