Commit d18d37ce authored by Jannis Leidel's avatar Jannis Leidel
Browse files

Added our own rmtree error handler to make sure we can delete correctly delete...

Added our own rmtree error handler to make sure we can delete correctly delete .svn directories when running the tests on Windows which are read-only for some reason.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15120 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 0de63c96
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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)
+4 −1
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ from django.core.management import call_command
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 @@ class BuildStaticTestCase(StaticFilesTestCase):
        self.run_collectstatic()

    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()