Skip to content

Commit f0d0306

Browse files
Issue python#28666: Now test.test_support.rmtree is able to remove unwritable or
unreadable directories on Windows too.
1 parent b7c057a commit f0d0306

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

Lib/test/test_support.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,16 @@ def unload(name):
182182
except KeyError:
183183
pass
184184

185+
def _force_run(path, func, *args):
186+
try:
187+
return func(*args)
188+
except EnvironmentError as err:
189+
if verbose >= 2:
190+
print('%s: %s' % (err.__class__.__name__, err))
191+
print('re-run %s%r' % (func.__name__, args))
192+
os.chmod(path, stat.S_IRWXU)
193+
return func(*args)
194+
185195
if sys.platform.startswith("win"):
186196
def _waitfor(func, pathname, waitall=False):
187197
# Perform the operation
@@ -224,13 +234,13 @@ def _rmdir(dirname):
224234

225235
def _rmtree(path):
226236
def _rmtree_inner(path):
227-
for name in os.listdir(path):
237+
for name in _force_run(path, os.listdir, path):
228238
fullname = os.path.join(path, name)
229239
if os.path.isdir(fullname):
230240
_waitfor(_rmtree_inner, fullname, waitall=True)
231-
os.rmdir(fullname)
241+
_force_run(path, os.rmdir, fullname)
232242
else:
233-
os.unlink(fullname)
243+
_force_run(path, os.unlink, fullname)
234244
_waitfor(_rmtree_inner, path, waitall=True)
235245
_waitfor(os.rmdir, path)
236246
else:
@@ -245,27 +255,18 @@ def _rmtree(path):
245255
except EnvironmentError:
246256
pass
247257

248-
def force_run(path, func, *args):
249-
try:
250-
return func(*args)
251-
except EnvironmentError as err:
252-
if verbose >= 2:
253-
print('%s: %s' % (err.__class__.__name__, err))
254-
print('re-run %s%r' % (func.__name__, args))
255-
os.chmod(path, stat.S_IRWXU)
256-
return func(*args)
257258
def _rmtree_inner(path):
258-
for name in force_run(path, os.listdir, path):
259+
for name in _force_run(path, os.listdir, path):
259260
fullname = os.path.join(path, name)
260261
try:
261262
mode = os.lstat(fullname).st_mode
262263
except EnvironmentError:
263264
mode = 0
264265
if stat.S_ISDIR(mode):
265266
_rmtree_inner(fullname)
266-
force_run(path, os.rmdir, fullname)
267+
_force_run(path, os.rmdir, fullname)
267268
else:
268-
force_run(path, os.unlink, fullname)
269+
_force_run(path, os.unlink, fullname)
269270
_rmtree_inner(path)
270271
os.rmdir(path)
271272

0 commit comments

Comments
 (0)