summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--platform_utils.py9
-rwxr-xr-xproject.py64
2 files changed, 39 insertions, 34 deletions
diff --git a/platform_utils.py b/platform_utils.py
index 77e8fdf5..6684ebc8 100644
--- a/platform_utils.py
+++ b/platform_utils.py
@@ -241,14 +241,15 @@ def _makelongpath(path):
241 return path 241 return path
242 242
243 243
244def rmtree(path): 244def rmtree(path, ignore_errors=False):
245 """shutil.rmtree(path) wrapper with support for long paths on Windows. 245 """shutil.rmtree(path) wrapper with support for long paths on Windows.
246 246
247 Availability: Unix, Windows.""" 247 Availability: Unix, Windows."""
248 onerror = None
248 if isWindows(): 249 if isWindows():
249 shutil.rmtree(_makelongpath(path), onerror=handle_rmtree_error) 250 path = _makelongpath(path)
250 else: 251 onerror = handle_rmtree_error
251 shutil.rmtree(path) 252 shutil.rmtree(path, ignore_errors=ignore_errors, onerror=onerror)
252 253
253 254
254def handle_rmtree_error(function, path, excinfo): 255def handle_rmtree_error(function, path, excinfo):
diff --git a/project.py b/project.py
index 51160a94..a2a3adc8 100755
--- a/project.py
+++ b/project.py
@@ -2706,41 +2706,45 @@ class Project(object):
2706 raise 2706 raise
2707 2707
2708 def _InitWorkTree(self, force_sync=False, submodules=False): 2708 def _InitWorkTree(self, force_sync=False, submodules=False):
2709 dotgit = os.path.join(self.worktree, '.git') 2709 realdotgit = os.path.join(self.worktree, '.git')
2710 init_dotgit = not os.path.exists(dotgit) 2710 tmpdotgit = realdotgit + '.tmp'
2711 init_dotgit = not os.path.exists(realdotgit)
2712 if init_dotgit:
2713 dotgit = tmpdotgit
2714 platform_utils.rmtree(tmpdotgit, ignore_errors=True)
2715 os.makedirs(tmpdotgit)
2716 self._ReferenceGitDir(self.gitdir, tmpdotgit, share_refs=True,
2717 copy_all=False)
2718 else:
2719 dotgit = realdotgit
2720
2711 try: 2721 try:
2712 if init_dotgit: 2722 self._CheckDirReference(self.gitdir, dotgit, share_refs=True)
2713 os.makedirs(dotgit) 2723 except GitError as e:
2714 self._ReferenceGitDir(self.gitdir, dotgit, share_refs=True, 2724 if force_sync and not init_dotgit:
2715 copy_all=False) 2725 try:
2726 platform_utils.rmtree(dotgit)
2727 return self._InitWorkTree(force_sync=False, submodules=submodules)
2728 except:
2729 raise e
2730 raise e
2716 2731
2717 try: 2732 if init_dotgit:
2718 self._CheckDirReference(self.gitdir, dotgit, share_refs=True) 2733 _lwrite(os.path.join(tmpdotgit, HEAD), '%s\n' % self.GetRevisionId())
2719 except GitError as e:
2720 if force_sync:
2721 try:
2722 platform_utils.rmtree(dotgit)
2723 return self._InitWorkTree(force_sync=False, submodules=submodules)
2724 except:
2725 raise e
2726 raise e
2727 2734
2728 if init_dotgit: 2735 # Now that the .git dir is fully set up, move it to its final home.
2729 _lwrite(os.path.join(dotgit, HEAD), '%s\n' % self.GetRevisionId()) 2736 platform_utils.rename(tmpdotgit, realdotgit)
2730 2737
2731 cmd = ['read-tree', '--reset', '-u'] 2738 # Finish checking out the worktree.
2732 cmd.append('-v') 2739 cmd = ['read-tree', '--reset', '-u']
2733 cmd.append(HEAD) 2740 cmd.append('-v')
2734 if GitCommand(self, cmd).Wait() != 0: 2741 cmd.append(HEAD)
2735 raise GitError("cannot initialize work tree for " + self.name) 2742 if GitCommand(self, cmd).Wait() != 0:
2743 raise GitError('Cannot initialize work tree for ' + self.name)
2736 2744
2737 if submodules: 2745 if submodules:
2738 self._SyncSubmodules(quiet=True) 2746 self._SyncSubmodules(quiet=True)
2739 self._CopyAndLinkFiles() 2747 self._CopyAndLinkFiles()
2740 except Exception:
2741 if init_dotgit:
2742 platform_utils.rmtree(dotgit)
2743 raise
2744 2748
2745 def _get_symlink_error_message(self): 2749 def _get_symlink_error_message(self):
2746 if platform_utils.isWindows(): 2750 if platform_utils.isWindows():