diff --git a/IntelliTect.Multitool.Tests/RepositoryPaths.Tests.cs b/IntelliTect.Multitool.Tests/RepositoryPaths.Tests.cs index 902ce18..636408b 100644 --- a/IntelliTect.Multitool.Tests/RepositoryPaths.Tests.cs +++ b/IntelliTect.Multitool.Tests/RepositoryPaths.Tests.cs @@ -43,4 +43,25 @@ public void TrySearchForGitContainingDirectory_ReturnsFalseWhenNotFound() Assert.False(RepositoryPaths.TrySearchForGitContainingDirectory(new DirectoryInfo(path), out string gitParentDirectory)); Assert.Empty(gitParentDirectory); } + + [Fact] + public void TrySearchForGitContainingDirectory_ReturnsTrueWhenGitIsAFile() + { + // In a git worktree, .git is a file (gitfile pointer), not a directory. + // This test simulates that scenario. + string tempRoot = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + string subDir = Path.Combine(tempRoot, "subdir"); + try + { + Directory.CreateDirectory(subDir); + File.WriteAllText(Path.Combine(tempRoot, ".git"), "gitdir: ../.git/worktrees/my-branch"); + + Assert.True(RepositoryPaths.TrySearchForGitContainingDirectory(new DirectoryInfo(subDir), out string gitParentDirectory)); + Assert.Equal(tempRoot, gitParentDirectory); + } + finally + { + Directory.Delete(tempRoot, recursive: true); + } + } } \ No newline at end of file diff --git a/IntelliTect.Multitool/Build/IntelliTect.Multitool.targets b/IntelliTect.Multitool/Build/IntelliTect.Multitool.targets index 9ef1ffb..705ec1a 100644 --- a/IntelliTect.Multitool/Build/IntelliTect.Multitool.targets +++ b/IntelliTect.Multitool/Build/IntelliTect.Multitool.targets @@ -21,6 +21,7 @@ - + + diff --git a/IntelliTect.Multitool/RepositoryPaths.cs b/IntelliTect.Multitool/RepositoryPaths.cs index 68627f2..bb57510 100644 --- a/IntelliTect.Multitool/RepositoryPaths.cs +++ b/IntelliTect.Multitool/RepositoryPaths.cs @@ -71,7 +71,8 @@ public static bool TrySearchForGitContainingDirectory(DirectoryInfo? searchStart while (searchStartDirectory is not null) { DirectoryInfo[] subDirectories = searchStartDirectory.GetDirectories(".git"); - if (subDirectories.Length > 0) + // Also check for a .git file (present in git worktrees as a gitfile pointer) + if (subDirectories.Length > 0 || File.Exists(Path.Combine(searchStartDirectory.FullName, ".git"))) { gitParentDirectory = searchStartDirectory.FullName; return true;