Skip to content
Browse files

Added our own rmtree error handler to make sure we can delete correct…

…ly delete .svn directories when running the tests on Windows which are read-only for some reason.

git-svn-id: bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent 0de63c9 commit d18d37ce291e8dae4c9444afa5ab59f99bd45ecc @jezdez jezdez committed
20 django/utils/
@@ -44,3 +44,23 @@ def safe_join(base, *paths):
raise ValueError('The joined path (%s) is located outside of the base '
'path component (%s)' % (final_path, base_path))
return final_path
+def rmtree_errorhandler(func, path, exc_info):
+ """
+ On Windows, some files are read-only (e.g. in in .svn dirs), so when
+ rmtree() tries to remove them, an exception is thrown.
+ We catch that here, remove the read-only attribute, and hopefully
+ continue without problems.
+ """
+ exctype, value = exc_info[:2]
+ # lookin for a windows error
+ if exctype is not WindowsError or 'Access is denied' not in str(value):
+ raise
+ # file type should currently be read only
+ if ((os.stat(path).st_mode & stat.S_IREAD) != stat.S_IREAD):
+ raise
+ # convert to read/write
+ os.chmod(path, stat.S_IWRITE)
+ # use the original function to repeat the operation
+ func(path)
5 tests/regressiontests/staticfiles_tests/
@@ -13,6 +13,7 @@
from django.db.models.loading import load_app
from django.template import Template, Context
from django.test import TestCase
+from django.utils._os import rmtree_errorhandler
TEST_ROOT = os.path.normcase(os.path.dirname(__file__))
@@ -97,7 +98,9 @@ def setUp(self):
def tearDown(self):
- shutil.rmtree(settings.STATIC_ROOT)
+ # Use our own error handler that can handle .svn dirs on Windows
+ shutil.rmtree(settings.STATIC_ROOT, ignore_errors=True,
+ onerror=rmtree_errorhandler)
settings.STATIC_ROOT = self.old_root
super(BuildStaticTestCase, self).tearDown()

0 comments on commit d18d37c

Please sign in to comment.
Something went wrong with that request. Please try again.