diff --git a/src/Microsoft.Build.Tasks.Git.UnitTests/GitRepositoryTests.cs b/src/Microsoft.Build.Tasks.Git.UnitTests/GitRepositoryTests.cs index ec0794ee..17819b0c 100644 --- a/src/Microsoft.Build.Tasks.Git.UnitTests/GitRepositoryTests.cs +++ b/src/Microsoft.Build.Tasks.Git.UnitTests/GitRepositoryTests.cs @@ -344,14 +344,26 @@ public void GetSubmoduleHeadCommitSha() var gitDir = temp.CreateDirectory(); var workingDir = temp.CreateDirectory(); - var basicSubmoduleGitDir = temp.CreateDirectory(); + var submoduleGitDir = temp.CreateDirectory(); - var basicSubmoduleWorkingDir = workingDir.CreateDirectory("sub").CreateDirectory("abc"); - basicSubmoduleWorkingDir.CreateFile(".git").WriteAllText("gitdir: " + basicSubmoduleGitDir.Path + "\t \v\f\r\n\n\r"); + var submoduleWorkingDir = workingDir.CreateDirectory("sub").CreateDirectory("abc"); + submoduleWorkingDir.CreateFile(".git").WriteAllText("gitdir: " + submoduleGitDir.Path + "\t \v\f\r\n\n\r"); - var basicSubmoduleRefsHeadsDir = basicSubmoduleGitDir.CreateDirectory("refs").CreateDirectory("heads"); - basicSubmoduleRefsHeadsDir.CreateFile("master").WriteAllText("0000000000000000000000000000000000000000"); - basicSubmoduleGitDir.CreateFile("HEAD").WriteAllText("ref: refs/heads/master"); + var submoduleRefsHeadsDir = submoduleGitDir.CreateDirectory("refs").CreateDirectory("heads"); + submoduleRefsHeadsDir.CreateFile("master").WriteAllText("0000000000000000000000000000000000000000"); + submoduleGitDir.CreateFile("HEAD").WriteAllText("ref: refs/heads/master"); + + var repository = new GitRepository(GitEnvironment.Empty, GitConfig.Empty, gitDir.Path, gitDir.Path, workingDir.Path); + Assert.Equal("0000000000000000000000000000000000000000", repository.ReadSubmoduleHeadCommitSha(submoduleWorkingDir.Path)); + } + + [Fact] + public void GetOldStyleSubmoduleHeadCommitSha() + { + using var temp = new TempRoot(); + + var gitDir = temp.CreateDirectory(); + var workingDir = temp.CreateDirectory(); // this is a unusual but legal case which can occur with older versions of Git or other tools. // see https://git-scm.com/docs/gitsubmodules#_forms for more details. @@ -362,7 +374,6 @@ public void GetSubmoduleHeadCommitSha() oldStyleSubmoduleGitDir.CreateFile("HEAD").WriteAllText("ref: refs/heads/branch1"); var repository = new GitRepository(GitEnvironment.Empty, GitConfig.Empty, gitDir.Path, gitDir.Path, workingDir.Path); - Assert.Equal("0000000000000000000000000000000000000000", repository.ReadSubmoduleHeadCommitSha(basicSubmoduleWorkingDir.Path)); Assert.Equal("1111111111111111111111111111111111111111", repository.ReadSubmoduleHeadCommitSha(oldStyleSubmoduleWorkingDir.Path)); } } diff --git a/src/Microsoft.Build.Tasks.Git/GitDataReader/GitRepository.cs b/src/Microsoft.Build.Tasks.Git/GitDataReader/GitRepository.cs index c079197b..d7d0d93a 100644 --- a/src/Microsoft.Build.Tasks.Git/GitDataReader/GitRepository.cs +++ b/src/Microsoft.Build.Tasks.Git/GitDataReader/GitRepository.cs @@ -215,14 +215,13 @@ public static GitRepository OpenRepository(GitRepositoryLocation location, GitEn // See https://git-scm.com/docs/gitsubmodules#_forms for more details. // Handle this case first since the other case throws. var dotGitPath = Path.Combine(submoduleWorkingDirectoryFullPath, GitDirName); - if (IsGitDirectory(dotGitPath, out var directSubmoduleGitDirectory)) - { - var submoduleGitDirResolver = new GitReferenceResolver(directSubmoduleGitDirectory, directSubmoduleGitDirectory); - return submoduleGitDirResolver.ResolveHeadReference(); - } - var gitDirectory = ReadDotGitFile(Path.Combine(submoduleWorkingDirectoryFullPath, GitDirName)); - if (!IsGitDirectory(gitDirectory, out var commonDirectory)) + var gitDirectory = + Directory.Exists(dotGitPath) ? dotGitPath : + File.Exists(dotGitPath) ? ReadDotGitFile(dotGitPath) : + null; + + if (gitDirectory == null || !IsGitDirectory(gitDirectory, out var commonDirectory)) { return null; }