From b36dfc6efdbf1218cf7206affd57ed2f4bd85bbf Mon Sep 17 00:00:00 2001 From: Matt Burtka Date: Wed, 5 Aug 2026 08:04:31 -0400 Subject: [PATCH] Fix indexing into tree with trailing slash --- LibGit2Sharp.Tests/TreeFixture.cs | 25 +++++++++++++++++++++++++ LibGit2Sharp/Tree.cs | 5 +++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/LibGit2Sharp.Tests/TreeFixture.cs b/LibGit2Sharp.Tests/TreeFixture.cs index a3a8d89eb..412f90e36 100644 --- a/LibGit2Sharp.Tests/TreeFixture.cs +++ b/LibGit2Sharp.Tests/TreeFixture.cs @@ -241,6 +241,31 @@ public void CanRetrieveTreeEntryPath() } } + [Fact] + public void CanUseTrailingSlashToIndexIntoSubtree() + { + var path = SandboxBareTestRepo(); + using (var repo = new Repository(path)) + { + var tree = repo.Lookup(sha); + Assert.False(tree.IsMissing); + + var treeEntry1 = tree["1/"]; + var treeEntry2 = tree["1"]; + + Assert.NotNull(treeEntry1); + Assert.NotNull(treeEntry1.Target); + Assert.NotNull(treeEntry2); + Assert.NotNull(treeEntry2.Target); + + Assert.Equal(treeEntry1.Name, treeEntry2.Name); + Assert.Equal(treeEntry1.TargetType, treeEntry2.TargetType); + Assert.Equal(treeEntry1.Target.Sha, treeEntry2.Target.Sha); + Assert.Equal(treeEntry1.Mode, treeEntry2.Mode); + Assert.Equal(treeEntry1.Path, treeEntry2.Path); + } + } + [Fact] public void CanParseSymlinkTreeEntries() { diff --git a/LibGit2Sharp/Tree.cs b/LibGit2Sharp/Tree.cs index 30f534a99..e644c4fe0 100644 --- a/LibGit2Sharp/Tree.cs +++ b/LibGit2Sharp/Tree.cs @@ -68,8 +68,9 @@ private unsafe TreeEntry RetrieveFromPath(string relativePath) return null; } - string filename = relativePath.Split('/').Last(); - string parentPath = relativePath.Substring(0, relativePath.Length - filename.Length); + string trimmed = relativePath.TrimEnd('/'); + string filename = trimmed.Split('/').Last(); + string parentPath = trimmed.Substring(0, trimmed.Length - filename.Length); return new TreeEntry(treeEntry, Id, repo, Tree.CombinePath(path, parentPath)); } }