diff options
Diffstat (limited to 'eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/rmtree.py')
-rw-r--r-- | eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/rmtree.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/rmtree.py b/eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/rmtree.py new file mode 100644 index 0000000..a4995f2 --- /dev/null +++ b/eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/rmtree.py @@ -0,0 +1,66 @@ +############################################################################## +# +# Copyright (c) 2006 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## + + +import shutil +import os +import doctest + +def rmtree (path): + """ + A variant of shutil.rmtree which tries hard to be successful + On windows shutil.rmtree aborts when it tries to delete a + read only file. + This tries to chmod the file to writeable and retries before giving up. + + >>> from tempfile import mkdtemp + + Let's make a directory ... + + >>> d = mkdtemp() + + and make sure it is actually there + + >>> os.path.isdir (d) + 1 + + Now create a file ... + + >>> foo = os.path.join (d, 'foo') + >>> open (foo, 'w').write ('huhu') + + and make it unwriteable + + >>> os.chmod (foo, 0400) + + rmtree should be able to remove it: + + >>> rmtree (d) + + and now the directory is gone + + >>> os.path.isdir (d) + 0 + """ + def retry_writeable (func, path, exc): + os.chmod (path, 0600) + func (path) + + shutil.rmtree (path, onerror = retry_writeable) + +def test_suite(): + return doctest.DocTestSuite() + +if "__main__" == __name__: + doctest.testmod() |