Skip to content

Commit 732193a

Browse files
feat: Enhances git repo detection for worktrees (#181)
Fixes #180
1 parent 6b50495 commit 732193a

3 files changed

Lines changed: 25 additions & 2 deletions

File tree

IntelliTect.Multitool.Tests/RepositoryPaths.Tests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,25 @@ public void TrySearchForGitContainingDirectory_ReturnsFalseWhenNotFound()
4343
Assert.False(RepositoryPaths.TrySearchForGitContainingDirectory(new DirectoryInfo(path), out string gitParentDirectory));
4444
Assert.Empty(gitParentDirectory);
4545
}
46+
47+
[Fact]
48+
public void TrySearchForGitContainingDirectory_ReturnsTrueWhenGitIsAFile()
49+
{
50+
// In a git worktree, .git is a file (gitfile pointer), not a directory.
51+
// This test simulates that scenario.
52+
string tempRoot = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
53+
string subDir = Path.Combine(tempRoot, "subdir");
54+
try
55+
{
56+
Directory.CreateDirectory(subDir);
57+
File.WriteAllText(Path.Combine(tempRoot, ".git"), "gitdir: ../.git/worktrees/my-branch");
58+
59+
Assert.True(RepositoryPaths.TrySearchForGitContainingDirectory(new DirectoryInfo(subDir), out string gitParentDirectory));
60+
Assert.Equal(tempRoot, gitParentDirectory);
61+
}
62+
finally
63+
{
64+
Directory.Delete(tempRoot, recursive: true);
65+
}
66+
}
4667
}

IntelliTect.Multitool/Build/IntelliTect.Multitool.targets

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
</LUTInformation>
3333
</PropertyGroup>
3434

35-
<WriteLinesToFile File="$(TempStagingPath)\IntelliTect.MultiTool.BuildVariables.tmp" Overwrite="true" Lines="$(LUTInformation)" />
35+
<WriteLinesToFile File="$(TempStagingPath)\IntelliTect.MultiTool.BuildVariables.tmp" Overwrite="true" Lines="$(LUTInformation)" Condition="'$(SolutionDir)' != ''" />
36+
<WriteLinesToFile File="$(TempStagingPath)\IntelliTect.MultiTool.BuildVariables.tmp" Overwrite="true" Lines="$(LUTInformation)" Condition="'$(SolutionDir)' == '' AND !Exists('$(TempStagingPath)\IntelliTect.MultiTool.BuildVariables.tmp')" />
3637
</Target>
3738
</Project>

IntelliTect.Multitool/RepositoryPaths.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ public static bool TrySearchForGitContainingDirectory(DirectoryInfo? searchStart
7171
while (searchStartDirectory is not null)
7272
{
7373
DirectoryInfo[] subDirectories = searchStartDirectory.GetDirectories(".git");
74-
if (subDirectories.Length > 0)
74+
// Also check for a .git file (present in git worktrees as a gitfile pointer)
75+
if (subDirectories.Length > 0 || File.Exists(Path.Combine(searchStartDirectory.FullName, ".git")))
7576
{
7677
gitParentDirectory = searchStartDirectory.FullName;
7778
return true;

0 commit comments

Comments
 (0)