summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
Diffstat (limited to 'project.py')
-rw-r--r--project.py49
1 files changed, 42 insertions, 7 deletions
diff --git a/project.py b/project.py
index b58bd53b..37cec98f 100644
--- a/project.py
+++ b/project.py
@@ -3430,20 +3430,21 @@ class Project:
3430 self._InitGitWorktree() 3430 self._InitGitWorktree()
3431 self._CopyAndLinkFiles() 3431 self._CopyAndLinkFiles()
3432 else: 3432 else:
3433 # Remove old directory symbolic links for submodules.
3434 if self.parent and platform_utils.islink(dotgit):
3435 platform_utils.remove(dotgit)
3436 init_dotgit = True
3437
3433 if not init_dotgit: 3438 if not init_dotgit:
3434 # See if the project has changed. 3439 # See if the project has changed.
3435 if os.path.realpath(self.gitdir) != os.path.realpath(dotgit): 3440 self._removeBadGitDirLink(dotgit)
3436 platform_utils.remove(dotgit)
3437 3441
3438 if init_dotgit or not os.path.exists(dotgit): 3442 if init_dotgit or not os.path.exists(dotgit):
3439 os.makedirs(self.worktree, exist_ok=True) 3443 self._createDotGit(dotgit)
3440 platform_utils.symlink(
3441 os.path.relpath(self.gitdir, self.worktree), dotgit
3442 )
3443 3444
3444 if init_dotgit: 3445 if init_dotgit:
3445 _lwrite( 3446 _lwrite(
3446 os.path.join(dotgit, HEAD), "%s\n" % self.GetRevisionId() 3447 os.path.join(self.gitdir, HEAD), f"{self.GetRevisionId()}\n"
3447 ) 3448 )
3448 3449
3449 # Finish checking out the worktree. 3450 # Finish checking out the worktree.
@@ -3465,6 +3466,40 @@ class Project:
3465 self._SyncSubmodules(quiet=True) 3466 self._SyncSubmodules(quiet=True)
3466 self._CopyAndLinkFiles() 3467 self._CopyAndLinkFiles()
3467 3468
3469 def _createDotGit(self, dotgit):
3470 """Initialize .git path.
3471
3472 For submodule projects, create a '.git' file using the gitfile
3473 mechanism, and for the rest, create a symbolic link.
3474 """
3475 os.makedirs(self.worktree, exist_ok=True)
3476 if self.parent:
3477 _lwrite(
3478 dotgit,
3479 f"gitdir: {os.path.relpath(self.gitdir, self.worktree)}\n",
3480 )
3481 else:
3482 platform_utils.symlink(
3483 os.path.relpath(self.gitdir, self.worktree), dotgit
3484 )
3485
3486 def _removeBadGitDirLink(self, dotgit):
3487 """Verify .git is initialized correctly, otherwise delete it."""
3488 if self.parent and os.path.isfile(dotgit):
3489 with open(dotgit) as fp:
3490 setting = fp.read()
3491 if not setting.startswith("gitdir:"):
3492 raise GitError(
3493 f"'.git' in {self.worktree} must start with 'gitdir:'",
3494 project=self.name,
3495 )
3496 gitdir = setting.split(":", 1)[1].strip()
3497 dotgit_path = os.path.normpath(os.path.join(self.worktree, gitdir))
3498 else:
3499 dotgit_path = os.path.realpath(dotgit)
3500 if os.path.realpath(self.gitdir) != dotgit_path:
3501 platform_utils.remove(dotgit)
3502
3468 @classmethod 3503 @classmethod
3469 def _MigrateOldWorkTreeGitDir(cls, dotgit, project=None): 3504 def _MigrateOldWorkTreeGitDir(cls, dotgit, project=None):
3470 """Migrate the old worktree .git/ dir style to a symlink. 3505 """Migrate the old worktree .git/ dir style to a symlink.