[Python-checkins] cpython (merge 3.6 -> default): Issue #28666: Now test.support.rmtree is able to remove unwritable or

serhiy.storchaka python-checkins at python.org
Sun Nov 20 10:43:24 EST 2016


https://hg.python.org/cpython/rev/593ec9658f4b
changeset:   105225:593ec9658f4b
parent:      105221:deff7bf26d00
parent:      105224:82ca763882f5
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sun Nov 20 17:43:09 2016 +0200
summary:
  Issue #28666: Now test.support.rmtree is able to remove unwritable or
unreadable directories on Windows too.

files:
  Lib/test/support/__init__.py |  31 ++++++++++++-----------
  1 files changed, 16 insertions(+), 15 deletions(-)


diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -298,6 +298,16 @@
     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 @@
 
     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 @@
                     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 @@
         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 @@
                     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)
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list