diff options
| -rw-r--r-- | platform_utils.py | 9 | ||||
| -rwxr-xr-x | project.py | 64 |
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 | ||
| 244 | def rmtree(path): | 244 | def 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 | ||
| 254 | def handle_rmtree_error(function, path, excinfo): | 255 | def handle_rmtree_error(function, path, excinfo): |
| @@ -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(): |
