summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--git/objects/submodule/base.py9
-rw-r--r--git/util.py20
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