From b321efd0948312413aaca0d22df1b2991c8671ca Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 7 Apr 2021 11:47:56 -0600 Subject: [PATCH] Fix discovery of git directories within submodules Fixes #578 --- src/NerdBank.GitVersioning/GitContext.cs | 10 ++++- .../ManagedGit/GitRepository.cs | 37 ++----------------- 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/src/NerdBank.GitVersioning/GitContext.cs b/src/NerdBank.GitVersioning/GitContext.cs index 7b632214..e9d9114b 100644 --- a/src/NerdBank.GitVersioning/GitContext.cs +++ b/src/NerdBank.GitVersioning/GitContext.cs @@ -214,8 +214,16 @@ protected static bool IsVersionFileChangedInWorkingTree(VersionOptions? committe return committedVersion is object; } - private protected static bool TryFindGitPaths(string path, [NotNullWhen(true)] out string? gitDirectory, [NotNullWhen(true)] out string? workingTreeDirectory, [NotNullWhen(true)] out string? workingTreeRelativePath) + internal static bool TryFindGitPaths(string? path, [NotNullWhen(true)] out string? gitDirectory, [NotNullWhen(true)] out string? workingTreeDirectory, [NotNullWhen(true)] out string? workingTreeRelativePath) { + if (path is null || path.Length == 0) + { + gitDirectory = null; + workingTreeDirectory = null; + workingTreeRelativePath = null; + return false; + } + path = Path.GetFullPath(path); var gitDirs = FindGitDir(path); if (gitDirs is null) diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs index 26a1ef84..227e2b89 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs @@ -40,42 +40,13 @@ public class GitRepository : IDisposable /// public static GitRepository? Create(string? workingDirectory) { - // Search for the top-level directory of the current git repository. This is the directory - // which contains a directory of file named .git. - // Loop until Path.GetDirectoryName returns null; in this case, we've reached the root of - // the file system (and we're not in a git repository). - while (!string.IsNullOrEmpty(workingDirectory) - && !File.Exists(Path.Combine(workingDirectory, GitDirectoryName)) - && !Directory.Exists(Path.Combine(workingDirectory, GitDirectoryName))) - { - workingDirectory = Path.GetDirectoryName(workingDirectory); - } - - if (string.IsNullOrEmpty(workingDirectory)) - { - return null; - } - - var gitDirectory = Path.Combine(workingDirectory, GitDirectoryName); - - if (File.Exists(gitDirectory)) - { - // This is a worktree, and the path to the git directory is stored in the .git file - var worktreeConfig = File.ReadAllText(gitDirectory); - - var gitDirStart = worktreeConfig.IndexOf("gitdir: "); - var gitDirEnd = worktreeConfig.IndexOf("\n", gitDirStart); - - gitDirectory = worktreeConfig.Substring(gitDirStart + 8, gitDirEnd - gitDirStart - 8); - } - - if (!Directory.Exists(gitDirectory)) + if (!GitContext.TryFindGitPaths(workingDirectory, out string? gitDirectory, out string? workingTreeDirectory, out string? workingTreeRelativePath)) { return null; } - var commonDirectory = gitDirectory; - var commonDirFile = Path.Combine(gitDirectory, "commondir"); + string commonDirectory = gitDirectory; + string commonDirFile = Path.Combine(gitDirectory, "commondir"); if (File.Exists(commonDirFile)) { @@ -83,7 +54,7 @@ public class GitRepository : IDisposable commonDirectory = Path.Combine(gitDirectory, commonDirectoryRelativePath); } - var objectDirectory = Path.Combine(commonDirectory, "objects"); + string objectDirectory = Path.Combine(commonDirectory, "objects"); return new GitRepository(workingDirectory!, gitDirectory, commonDirectory, objectDirectory); }