From 9b6f38d02c8ed1fb07eb6782b918f31efc4c42f3 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 | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'git/util.py') diff --git a/git/util.py b/git/util.py index 6576640a..a9e87d6f 100644 --- a/git/util.py +++ b/git/util.py @@ -8,6 +8,8 @@ import os import re import sys import time +import stat +import shutil import tempfile import platform @@ -23,10 +25,26 @@ from gitdb.util import ( __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', - 'RemoteProgress') + 'RemoteProgress', 'rmtree') #{ Utility Methods +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 of size chunk_size -- cgit v1.2.1