diff options
Diffstat (limited to 'project.py')
-rw-r--r-- | project.py | 42 |
1 files changed, 37 insertions, 5 deletions
@@ -2794,6 +2794,35 @@ class Project(object): | |||
2794 | else: | 2794 | else: |
2795 | raise | 2795 | raise |
2796 | 2796 | ||
2797 | def _InitialCheckoutStart(self): | ||
2798 | """Called when checking out a project for the first time. | ||
2799 | |||
2800 | This will use temporary non-visible paths so we can be safely interrupted | ||
2801 | without leaving incomplete state behind. | ||
2802 | """ | ||
2803 | paths = [f'{x}.tmp' for x in (self.relpath, self.worktree, self.gitdir, self.objdir)] | ||
2804 | for p in paths: | ||
2805 | platform_utils.rmtree(p, ignore_errors=True) | ||
2806 | self.UpdatePaths(*paths) | ||
2807 | |||
2808 | def _InitialCheckoutFinalizeNetworkHalf(self): | ||
2809 | """Finalize the object dirs after network syncing works.""" | ||
2810 | # Once the network half finishes, we can move the objects into the right | ||
2811 | # place by removing the ".tmp" suffix on the dirs. | ||
2812 | platform_utils.rmtree(self.gitdir[:-4], ignore_errors=True) | ||
2813 | os.rename(self.gitdir, self.gitdir[:-4]) | ||
2814 | self.UpdatePaths(self.relpath, self.worktree, self.gitdir[:-4], self.objdir[:-4]) | ||
2815 | |||
2816 | def _InitialCheckoutFinalizeLocalHalf(self): | ||
2817 | """Finalize the initial checkout and make it available.""" | ||
2818 | assert self.gitdir == self.objdir | ||
2819 | # Once the local half finishes, we can move the manifest dir into the right | ||
2820 | # place by removing the ".tmp" suffix on the dirs. | ||
2821 | platform_utils.rmtree(self.worktree[:-4], ignore_errors=True) | ||
2822 | os.rename(self.worktree, self.worktree[:-4]) | ||
2823 | self.UpdatePaths( | ||
2824 | self.relpath[:-4], self.worktree[:-4], self.gitdir, self.objdir) | ||
2825 | |||
2797 | def _InitGitWorktree(self): | 2826 | def _InitGitWorktree(self): |
2798 | """Init the project using git worktrees.""" | 2827 | """Init the project using git worktrees.""" |
2799 | self.bare_git.worktree('prune') | 2828 | self.bare_git.worktree('prune') |
@@ -3680,6 +3709,8 @@ class ManifestProject(MetaProject): | |||
3680 | (GitConfig.ForUser().UrlInsteadOf(manifest_url),), | 3709 | (GitConfig.ForUser().UrlInsteadOf(manifest_url),), |
3681 | file=sys.stderr) | 3710 | file=sys.stderr) |
3682 | 3711 | ||
3712 | self._InitialCheckoutStart() | ||
3713 | |||
3683 | # The manifest project object doesn't keep track of the path on the | 3714 | # The manifest project object doesn't keep track of the path on the |
3684 | # server where this git is located, so let's save that here. | 3715 | # server where this git is located, so let's save that here. |
3685 | mirrored_manifest_git = None | 3716 | mirrored_manifest_git = None |
@@ -3839,16 +3870,14 @@ class ManifestProject(MetaProject): | |||
3839 | partial_clone_exclude=self.manifest.PartialCloneExclude): | 3870 | partial_clone_exclude=self.manifest.PartialCloneExclude): |
3840 | r = self.GetRemote() | 3871 | r = self.GetRemote() |
3841 | print('fatal: cannot obtain manifest %s' % r.url, file=sys.stderr) | 3872 | print('fatal: cannot obtain manifest %s' % r.url, file=sys.stderr) |
3842 | |||
3843 | # Better delete the manifest git dir if we created it; otherwise next | ||
3844 | # time (when user fixes problems) we won't go through the "is_new" logic. | ||
3845 | if is_new: | ||
3846 | platform_utils.rmtree(self.gitdir) | ||
3847 | return False | 3873 | return False |
3848 | 3874 | ||
3849 | if manifest_branch: | 3875 | if manifest_branch: |
3850 | self.MetaBranchSwitch(submodules=submodules) | 3876 | self.MetaBranchSwitch(submodules=submodules) |
3851 | 3877 | ||
3878 | if is_new: | ||
3879 | self._InitialCheckoutFinalizeNetworkHalf() | ||
3880 | |||
3852 | syncbuf = SyncBuffer(self.config) | 3881 | syncbuf = SyncBuffer(self.config) |
3853 | self.Sync_LocalHalf(syncbuf, submodules=submodules) | 3882 | self.Sync_LocalHalf(syncbuf, submodules=submodules) |
3854 | syncbuf.Finish() | 3883 | syncbuf.Finish() |
@@ -3871,6 +3900,9 @@ class ManifestProject(MetaProject): | |||
3871 | with open(dest, 'wb') as f: | 3900 | with open(dest, 'wb') as f: |
3872 | f.write(manifest_data) | 3901 | f.write(manifest_data) |
3873 | 3902 | ||
3903 | if is_new: | ||
3904 | self._InitialCheckoutFinalizeLocalHalf() | ||
3905 | |||
3874 | try: | 3906 | try: |
3875 | self.manifest.Link(manifest_name) | 3907 | self.manifest.Link(manifest_name) |
3876 | except ManifestParseError as e: | 3908 | except ManifestParseError as e: |