From 5a3b7310373351995c6f14d332773646be319a1f Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 13 Jun 2011 16:13:35 +0200 Subject: Submodule now uses a specialized method to remove its trees to allow read-only files to be removed on windows as well --- git/util.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'git/util.py') diff --git a/git/util.py b/git/util.py index 01940763..a31e5865 100644 --- a/git/util.py +++ b/git/util.py @@ -12,12 +12,14 @@ import sys import errno import re import time +import stat +import shutil import tempfile __all__ = ( "stream_copy", "join_path", "to_native_path_windows", "to_native_path_linux", "join_path_native", "Stats", "IndexFileSHA1Writer", "Iterable", "IterableList", "BlockingLockFile", "LockFile", 'Actor', 'get_user_id', 'assure_directory_exists', - 'RepoAliasMixin', 'LockedFD', 'LazyMixin' ) + 'RepoAliasMixin', 'LockedFD', 'LazyMixin', 'rmtree' ) from cStringIO import StringIO @@ -147,6 +149,19 @@ def is_git_dir(d): os.readlink(headref).startswith('refs')) return False +def rmtree(path): + """Remove the given recursively. + :note: we use shutil rmtree but adjust its behaviour to see whether files that + couldn't be deleted are read-only. Windows will not remove them in that case""" + def onerror(func, path, exc_info): + if not os.access(path, os.W_OK): + # Is the error an access error ? + os.chmod(path, stat.S_IWUSR) + func(path) + else: + raise + # END end onerror + return shutil.rmtree(path, False, onerror) def stream_copy(source, destination, chunk_size=512*1024): """Copy all data from the source stream into the destination stream in chunks -- cgit v1.2.1