diff options
| -rw-r--r-- | git/objects/submodule/base.py | 9 | ||||
| -rw-r--r-- | git/util.py | 20 | 
2 files changed, 23 insertions, 6 deletions
| diff --git a/git/objects/submodule/base.py b/git/objects/submodule/base.py index 2160299b..45b24a0d 100644 --- a/git/objects/submodule/base.py +++ b/git/objects/submodule/base.py @@ -13,7 +13,8 @@ from git.util import (  						Iterable,   						join_path_native,   						to_native_path_linux, -						RemoteProgress +						RemoteProgress, +						rmtree  					)  from git.config import SectionConstraint @@ -29,8 +30,6 @@ import os  import sys  import time -import shutil -  __all__ = ["Submodule", "UpdateProgress"] @@ -622,7 +621,7 @@ class Submodule(util.IndexObject, Iterable, Traversable):  				if os.path.islink(mp):  					method = os.remove  				elif os.path.isdir(mp): -					method = shutil.rmtree +					method = rmtree  				elif os.path.exists(mp):  					raise AssertionError("Cannot forcibly delete repository as it was neither a link, nor a directory")  				#END handle brutal deletion @@ -671,7 +670,7 @@ class Submodule(util.IndexObject, Iterable, Traversable):  				if not dry_run:  					wtd = mod.working_tree_dir  					del(mod)		# release file-handles (windows) -					shutil.rmtree(wtd) +					rmtree(wtd)  				# END delete tree if possible  			# END handle force  		# END handle module deletion 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 | 
