Skip to content

Commit dd24e78

Browse files
committed
Implement support for relativeworktrees extension
1 parent 4adc231 commit dd24e78

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

src/Microsoft.Build.Tasks.Git.UnitTests/GitRepositoryTests.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,27 @@ public void TryFindRepository_Worktree_Realistic()
6565
{
6666
using var temp = new TempRoot();
6767

68-
var mainWorkingDir = temp.CreateDirectory();
68+
var repoDir = temp.CreateDirectory();
69+
70+
var mainWorkingDir = repoDir.CreateDirectory("main");
6971
var mainWorkingSubDir = mainWorkingDir.CreateDirectory("A");
7072
var mainGitDir = mainWorkingDir.CreateDirectory(".git");
7173
mainGitDir.CreateFile("HEAD");
7274

7375
var worktreesDir = mainGitDir.CreateDirectory("worktrees");
7476
var worktreeGitDir = worktreesDir.CreateDirectory("myworktree");
7577
var worktreeGitSubDir = worktreeGitDir.CreateDirectory("B");
76-
var worktreeDir = temp.CreateDirectory();
78+
var worktreeDir = repoDir.CreateDirectory("worktree");
7779
var worktreeSubDir = worktreeDir.CreateDirectory("C");
78-
var worktreeGitFile = worktreeDir.CreateFile(".git").WriteAllText("gitdir: " + worktreeGitDir + " \r\n\t\v");
80+
81+
// test relative path to work tree dir:
82+
var worktreeGitFile = worktreeDir.CreateFile(".git").WriteAllText("gitdir: ../main/.git/worktrees/myworktree \r\n\t\v");
7983

8084
worktreeGitDir.CreateFile("HEAD");
8185
worktreeGitDir.CreateFile("commondir").WriteAllText("../..\n");
82-
worktreeGitDir.CreateFile("gitdir").WriteAllText(worktreeGitFile.Path + " \r\n\t\v");
86+
87+
// test relative path to work tree .git file:
88+
worktreeGitDir.CreateFile("gitdir").WriteAllText("../../../../worktree/.git \r\n\t\v");
8389

8490
// start under main repository directory:
8591
Assert.True(GitRepository.TryFindRepository(mainWorkingSubDir.Path, out var location));
@@ -226,6 +232,7 @@ public void OpenRepository_Version1_Extensions()
226232
preciousObjects = true
227233
partialClone = promisor_remote
228234
worktreeConfig = true
235+
relativeWorktrees = true
229236
objectformat = sha256
230237
");
231238

@@ -338,7 +345,7 @@ public void OpenRepository_Worktree_GitdirFileMissing()
338345
Assert.Equal(worktreeGitDir.Path, location.GitDirectory);
339346
Assert.Equal(mainGitDir.Path, location.CommonDirectory);
340347
Assert.Equal(worktreeDir.Path, location.WorkingDirectory);
341-
348+
342349
var repository = GitRepository.OpenRepository(location, GitEnvironment.Empty);
343350
Assert.Equal(repository.GitDirectory, location.GitDirectory);
344351
Assert.Equal(repository.CommonDirectory, location.CommonDirectory);
@@ -377,7 +384,7 @@ public void OpenRepository_Worktree_GitdirFileDifferentPath()
377384
var repository = GitRepository.OpenRepository(location, GitEnvironment.Empty);
378385
Assert.Equal(repository.GitDirectory, location.GitDirectory);
379386
Assert.Equal(repository.CommonDirectory, location.CommonDirectory);
380-
387+
381388
// actual working dir is not affected:
382389
Assert.Equal(worktreeDir.Path, location.WorkingDirectory);
383390
}

src/Microsoft.Build.Tasks.Git/GitDataReader/GitConfig.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ internal sealed partial class GitConfig
2121

2222
private const string RefStorageExtensionName = "refstorage";
2323
private const string ObjectFormatExtensionName = "objectFormat";
24+
private const string RelativeWorktreesExtensionName = "relativeWorktrees";
2425
private const string RepositoryFormatVersionVariableName = "repositoryformatversion";
2526

2627
private static readonly ImmutableArray<string> s_knownExtensions =
27-
["noop", "preciousObjects", "partialclone", "worktreeConfig", RefStorageExtensionName, ObjectFormatExtensionName];
28+
["noop", "preciousObjects", "partialclone", "worktreeConfig", RefStorageExtensionName, ObjectFormatExtensionName, RelativeWorktreesExtensionName];
2829

2930
public readonly ImmutableDictionary<GitVariableName, ImmutableArray<string>> Variables;
3031
public readonly ReferenceStorageFormat ReferenceStorageFormat;

0 commit comments

Comments
 (0)