From f0d0306c24f0de1c18f56b8e3a0a77ab3450c83f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 20 Nov 2016 17:42:03 +0200 Subject: [PATCH] Issue #28666: Now test.test_support.rmtree is able to remove unwritable or unreadable directories on Windows too. --- Lib/test/test_support.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index ce38ab7925..b76647d9e3 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -182,6 +182,16 @@ def unload(name): except KeyError: pass +def _force_run(path, func, *args): + try: + return func(*args) + except EnvironmentError 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 @@ -224,13 +234,13 @@ 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) if os.path.isdir(fullname): _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: @@ -245,17 +255,8 @@ else: except EnvironmentError: pass - def force_run(path, func, *args): - try: - return func(*args) - except EnvironmentError 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 @@ -263,9 +264,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) -- 2.50.1