From 1d5098617ec7f476b76d1aa676e2a001d2c3d533 Mon Sep 17 00:00:00 2001 From: Allen Webb Date: Tue, 29 Oct 2024 13:24:05 -0500 Subject: [PATCH] worktree: Do not try to fix relative paths --worktree was broken with incorrect paths in the .git files whenever the local copy of git populated gitdir with relative paths instead of absoulte paths. Bug: 376251410 Change-Id: Id32dc1576315218967de2a9bfe43bf7a5a0e7aa6 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/440801 Commit-Queue: Allen Webb Reviewed-by: Josip Sokcevic Tested-by: Allen Webb --- project.py | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/project.py b/project.py index 50daa82f..9a7681e0 100644 --- a/project.py +++ b/project.py @@ -3375,24 +3375,29 @@ class Project: setting = fp.read() assert setting.startswith("gitdir:") git_worktree_path = setting.split(":", 1)[1].strip() - # Some platforms (e.g. Windows) won't let us update dotgit in situ - # because of file permissions. Delete it and recreate it from scratch - # to avoid. - platform_utils.remove(dotgit) - # Use relative path from checkout->worktree & maintain Unix line endings - # on all OS's to match git behavior. - with open(dotgit, "w", newline="\n") as fp: - print( - "gitdir:", - os.path.relpath(git_worktree_path, self.worktree), - file=fp, - ) - # Use relative path from worktree->checkout & maintain Unix line endings - # on all OS's to match git behavior. - with open( - os.path.join(git_worktree_path, "gitdir"), "w", newline="\n" - ) as fp: - print(os.path.relpath(dotgit, git_worktree_path), file=fp) + + # `gitdir` maybe be either relative or absolute depending on the + # behavior of the local copy of git, so only convert the path to + # relative if it needs to be converted. + if os.path.isabs(git_worktree_path): + # Some platforms (e.g. Windows) won't let us update dotgit in situ + # because of file permissions. Delete it and recreate it from + # scratch to avoid. + platform_utils.remove(dotgit) + # Use relative path from checkout->worktree & maintain Unix line + # endings on all OS's to match git behavior. + with open(dotgit, "w", newline="\n") as fp: + print( + "gitdir:", + os.path.relpath(git_worktree_path, self.worktree), + file=fp, + ) + # Use relative path from worktree->checkout & maintain Unix line + # endings on all OS's to match git behavior. + with open( + os.path.join(git_worktree_path, "gitdir"), "w", newline="\n" + ) as fp: + print(os.path.relpath(dotgit, git_worktree_path), file=fp) self._InitMRef()