Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8551495

Browse files
Issue #28666: Now test.support.rmtree is able to remove unwritable or
unreadable directories on Windows too.
2 parents f0a6d34 + ba7eb8d commit 8551495

1 file changed

Lines changed: 16 additions & 15 deletions

File tree

Lib/test/support/__init__.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,16 @@ def unload(name):
298298
except KeyError:
299299
pass
300300

301+
def _force_run(path, func, *args):
302+
try:
303+
return func(*args)
304+
except OSError as err:
305+
if verbose >= 2:
306+
print('%s: %s' % (err.__class__.__name__, err))
307+
print('re-run %s%r' % (func.__name__, args))
308+
os.chmod(path, stat.S_IRWXU)
309+
return func(*args)
310+
301311
if sys.platform.startswith("win"):
302312
def _waitfor(func, pathname, waitall=False):
303313
# Perform the operation
@@ -340,7 +350,7 @@ def _rmdir(dirname):
340350

341351
def _rmtree(path):
342352
def _rmtree_inner(path):
343-
for name in os.listdir(path):
353+
for name in _force_run(path, os.listdir, path):
344354
fullname = os.path.join(path, name)
345355
try:
346356
mode = os.lstat(fullname).st_mode
@@ -350,9 +360,9 @@ def _rmtree_inner(path):
350360
mode = 0
351361
if stat.S_ISDIR(mode):
352362
_waitfor(_rmtree_inner, fullname, waitall=True)
353-
os.rmdir(fullname)
363+
_force_run(path, os.rmdir, fullname)
354364
else:
355-
os.unlink(fullname)
365+
_force_run(path, os.unlink, fullname)
356366
_waitfor(_rmtree_inner, path, waitall=True)
357367
_waitfor(os.rmdir, path)
358368
else:
@@ -366,27 +376,18 @@ def _rmtree(path):
366376
except OSError:
367377
pass
368378

369-
def force_run(path, func, *args):
370-
try:
371-
return func(*args)
372-
except OSError as err:
373-
if verbose >= 2:
374-
print('%s: %s' % (err.__class__.__name__, err))
375-
print('re-run %s%r' % (func.__name__, args))
376-
os.chmod(path, stat.S_IRWXU)
377-
return func(*args)
378379
def _rmtree_inner(path):
379-
for name in force_run(path, os.listdir, path):
380+
for name in _force_run(path, os.listdir, path):
380381
fullname = os.path.join(path, name)
381382
try:
382383
mode = os.lstat(fullname).st_mode
383384
except OSError:
384385
mode = 0
385386
if stat.S_ISDIR(mode):
386387
_rmtree_inner(fullname)
387-
force_run(path, os.rmdir, fullname)
388+
_force_run(path, os.rmdir, fullname)
388389
else:
389-
force_run(path, os.unlink, fullname)
390+
_force_run(path, os.unlink, fullname)
390391
_rmtree_inner(path)
391392
os.rmdir(path)
392393

0 commit comments

Comments
 (0)