From e9b28de1c02aa76a442fbe44440e35803532d1e9 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 12 Jun 2021 12:53:48 -0600 Subject: [PATCH 1/6] Add repro test for #602 --- .../GitContextTests.cs | 13 ++++++++++++- .../repos/PackedHeadRef.zip | Bin 0 -> 18594 bytes 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/NerdBank.GitVersioning.Tests/repos/PackedHeadRef.zip diff --git a/src/NerdBank.GitVersioning.Tests/GitContextTests.cs b/src/NerdBank.GitVersioning.Tests/GitContextTests.cs index 05c4e8d9..81cf1a83 100644 --- a/src/NerdBank.GitVersioning.Tests/GitContextTests.cs +++ b/src/NerdBank.GitVersioning.Tests/GitContextTests.cs @@ -162,4 +162,15 @@ public void SelectDirectory_SubDir() Assert.Equal("sub", this.Context.RepoRelativeProjectDirectory); Assert.Equal(absolutePath, this.Context.AbsoluteProjectDirectory); } -} + + [Fact] + public void GetVersion_PackedHead() + { + using var expandedRepo = TestUtilities.ExtractRepoArchive("PackedHeadRef"); + this.Context = this.CreateGitContext(Path.Combine(expandedRepo.RepoPath)); + var oracle = new VersionOracle(this.Context); + Assert.Equal("1.0.1", oracle.SimpleVersion.ToString()); + this.Context.TrySelectCommit("HEAD"); + Assert.Equal("1.0.1", oracle.SimpleVersion.ToString()); + } +} \ No newline at end of file diff --git a/src/NerdBank.GitVersioning.Tests/repos/PackedHeadRef.zip b/src/NerdBank.GitVersioning.Tests/repos/PackedHeadRef.zip new file mode 100644 index 0000000000000000000000000000000000000000..e1712d22aaa5d81cbf866af909977a2cabec8753 GIT binary patch literal 18594 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 BBbxvK literal 0 HcmV?d00001 From 47d7f467d9a8c28fb234db8af90bb342d3a15e6c Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 11 Jun 2021 11:02:15 +0200 Subject: [PATCH 2/6] Fix resolving HEAD reference if it's a packed ref --- src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs index 40cfc644..1d3b78b2 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs @@ -616,7 +616,9 @@ private GitObjectId ResolveReference(object reference) { if (!FileHelpers.TryOpen(Path.Combine(this.CommonDirectory, (string)reference), out FileStream? stream)) { - return GitObjectId.Empty; + // HEAD can point to a reference that's in the packed references and needs + // a full resolution. + return Lookup((string)reference) ?? GitObjectId.Empty; } using (stream) From ea9517bb6ca05e6272179aa7089b241334b6adfa Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 11 Jun 2021 11:55:16 +0200 Subject: [PATCH 3/6] Tweak GitRepository.Lookup error handling --- .../ManagedGit/GitRepository.cs | 97 ++++++++----------- 1 file changed, 43 insertions(+), 54 deletions(-) diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs index 1d3b78b2..52c8b5ea 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs @@ -222,9 +222,7 @@ public object GetHeadAsReferenceOrSha() /// public GitObjectId GetHeadCommitSha() { - var reference = this.GetHeadAsReferenceOrSha(); - var objectId = this.ResolveReference(reference); - return objectId; + return this.Lookup("HEAD") ?? GitObjectId.Empty; } /// @@ -280,9 +278,17 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) /// The object ID referenced by if found; otherwise . public GitObjectId? Lookup(string objectish) { + bool skipObjectIdLookup = false; + if (objectish == "HEAD") { - return this.GetHeadCommitSha(); + var reference = this.GetHeadAsReferenceOrSha(); + if (reference is GitObjectId headObjectId) + { + return headObjectId; + } + + objectish = (string)reference; } var possibleLooseFileMatches = new List(); @@ -290,6 +296,7 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) { // Match on loose ref files by their canonical name. possibleLooseFileMatches.Add(Path.Combine(this.GitDirectory, objectish)); + skipObjectIdLookup = true; } else { @@ -341,6 +348,11 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) } } + if (skipObjectIdLookup) + { + return null; + } + if (objectish.Length == 40) { return GitObjectId.Parse(objectish); @@ -372,25 +384,26 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) objectish += "0"; } - var hex = ConvertHexStringToByteArray(objectish); - - foreach (var pack in this.packs.Value.Span) + if (TryConvertHexStringToByteArray(objectish, out var hex)) { - var objectId = pack.Lookup(hex, endsWithHalfByte); - - // It's possible for the same object to be present in both the object database and the pack files, - // or in multiple pack files. - if (objectId != null && !possibleObjectIds.Contains(objectId.Value)) + foreach (var pack in this.packs.Value.Span) { - if (possibleObjectIds.Count > 0) - { - // If objectish already resolved to at least one object which is different from the current - // object id, objectish is not well-defined; so stop resolving and return null instead. - return null; - } - else + var objectId = pack.Lookup(hex, endsWithHalfByte); + + // It's possible for the same object to be present in both the object database and the pack files, + // or in multiple pack files. + if (objectId != null && !possibleObjectIds.Contains(objectId.Value)) { - possibleObjectIds.Add(objectId.Value); + if (possibleObjectIds.Count > 0) + { + // If objectish already resolved to at least one object which is different from the current + // object id, objectish is not well-defined; so stop resolving and return null instead. + return null; + } + else + { + possibleObjectIds.Add(objectId.Value); + } } } } @@ -610,35 +623,6 @@ private bool TryGetObjectByPath(GitObjectId sha, string objectType, [NotNullWhen return true; } - private GitObjectId ResolveReference(object reference) - { - if (reference is string) - { - if (!FileHelpers.TryOpen(Path.Combine(this.CommonDirectory, (string)reference), out FileStream? stream)) - { - // HEAD can point to a reference that's in the packed references and needs - // a full resolution. - return Lookup((string)reference) ?? GitObjectId.Empty; - } - - using (stream) - { - Span objectId = stackalloc byte[40]; - stream!.Read(objectId); - - return GitObjectId.ParseHex(objectId); - } - } - else if (reference is GitObjectId) - { - return (GitObjectId)reference; - } - else - { - throw new GitException(); - } - } - private ReadOnlyMemory LoadPacks() { var packDirectory = Path.Combine(this.ObjectDirectory, "pack/"); @@ -689,22 +673,27 @@ private static string TrimEndingDirectorySeparator(string path) #endif } - private static byte[] ConvertHexStringToByteArray(string hexString) + private static bool TryConvertHexStringToByteArray(string hexString, out byte[]? data) { // https://stackoverflow.com/questions/321370/how-can-i-convert-a-hex-string-to-a-byte-array if (hexString.Length % 2 != 0) { - throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString)); + data = null; + return false; } - byte[] data = new byte[hexString.Length / 2]; + data = new byte[hexString.Length / 2]; for (int index = 0; index < data.Length; index++) { string byteValue = hexString.Substring(index * 2, 2); - data[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture); + if (byte.TryParse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out data[index])) + { + data = null; + return false; + } } - return data; + return true; } /// From 35a11f534b6ff02984f5818f8b7db79cf39cdc55 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 11 Jun 2021 12:02:49 +0200 Subject: [PATCH 4/6] Fix flipped condition --- src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs index 52c8b5ea..c25efc43 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs @@ -686,7 +686,7 @@ private static bool TryConvertHexStringToByteArray(string hexString, out byte[]? for (int index = 0; index < data.Length; index++) { string byteValue = hexString.Substring(index * 2, 2); - if (byte.TryParse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out data[index])) + if (!byte.TryParse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out data[index])) { data = null; return false; From 4d8ecca72eff6d8d1465652c46800d9912dffe14 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 11 Jun 2021 12:16:45 +0200 Subject: [PATCH 5/6] Hopefully fix worktree support --- src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs index c25efc43..e7a6d851 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs @@ -295,7 +295,7 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) if (objectish.StartsWith("refs/", StringComparison.Ordinal)) { // Match on loose ref files by their canonical name. - possibleLooseFileMatches.Add(Path.Combine(this.GitDirectory, objectish)); + possibleLooseFileMatches.Add(Path.Combine(this.CommonDirectory, objectish)); skipObjectIdLookup = true; } else From 311f4775683cf7bd6cb802be995afa795ea2f653 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Sat, 12 Jun 2021 14:16:55 -0600 Subject: [PATCH 6/6] Touch-up on perf and add a test --- .../GitContextTests.cs | 10 +++- .../ManagedGit/GitRepository.cs | 48 ++++++++++++------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/NerdBank.GitVersioning.Tests/GitContextTests.cs b/src/NerdBank.GitVersioning.Tests/GitContextTests.cs index 81cf1a83..ccb93142 100644 --- a/src/NerdBank.GitVersioning.Tests/GitContextTests.cs +++ b/src/NerdBank.GitVersioning.Tests/GitContextTests.cs @@ -173,4 +173,12 @@ public void GetVersion_PackedHead() this.Context.TrySelectCommit("HEAD"); Assert.Equal("1.0.1", oracle.SimpleVersion.ToString()); } -} \ No newline at end of file + + [Fact] + public void HeadCanonicalName_PackedHead() + { + using var expandedRepo = TestUtilities.ExtractRepoArchive("PackedHeadRef"); + this.Context = this.CreateGitContext(Path.Combine(expandedRepo.RepoPath)); + Assert.Equal("refs/heads/main", this.Context.HeadCanonicalName); + } +} diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs index e7a6d851..459f23c6 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitRepository.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text; +using Validation; namespace Nerdbank.GitVersioning.ManagedGit { @@ -384,25 +385,29 @@ public GitCommit GetCommit(GitObjectId sha, bool readAuthor = false) objectish += "0"; } - if (TryConvertHexStringToByteArray(objectish, out var hex)) + if (objectish.Length <= 40 && objectish.Length % 2 == 0) { - foreach (var pack in this.packs.Value.Span) + Span decodedHex = stackalloc byte[objectish.Length / 2]; + if (TryConvertHexStringToByteArray(objectish, decodedHex)) { - var objectId = pack.Lookup(hex, endsWithHalfByte); - - // It's possible for the same object to be present in both the object database and the pack files, - // or in multiple pack files. - if (objectId != null && !possibleObjectIds.Contains(objectId.Value)) + foreach (var pack in this.packs.Value.Span) { - if (possibleObjectIds.Count > 0) - { - // If objectish already resolved to at least one object which is different from the current - // object id, objectish is not well-defined; so stop resolving and return null instead. - return null; - } - else + var objectId = pack.Lookup(decodedHex, endsWithHalfByte); + + // It's possible for the same object to be present in both the object database and the pack files, + // or in multiple pack files. + if (objectId != null && !possibleObjectIds.Contains(objectId.Value)) { - possibleObjectIds.Add(objectId.Value); + if (possibleObjectIds.Count > 0) + { + // If objectish already resolved to at least one object which is different from the current + // object id, objectish is not well-defined; so stop resolving and return null instead. + return null; + } + else + { + possibleObjectIds.Add(objectId.Value); + } } } } @@ -673,7 +678,7 @@ private static string TrimEndingDirectorySeparator(string path) #endif } - private static bool TryConvertHexStringToByteArray(string hexString, out byte[]? data) + private static bool TryConvertHexStringToByteArray(string hexString, Span data) { // https://stackoverflow.com/questions/321370/how-can-i-convert-a-hex-string-to-a-byte-array if (hexString.Length % 2 != 0) @@ -682,15 +687,22 @@ private static bool TryConvertHexStringToByteArray(string hexString, out byte[]? return false; } - data = new byte[hexString.Length / 2]; + Requires.Argument(data.Length == hexString.Length / 2, nameof(data), "Length must be exactly half that of " + nameof(hexString) + "."); for (int index = 0; index < data.Length; index++) { +#if NETCOREAPP3_1_OR_GREATER + ReadOnlySpan byteValue = hexString.AsSpan(index * 2, 2); + if (!byte.TryParse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out data[index])) + { + return false; + } +#else string byteValue = hexString.Substring(index * 2, 2); if (!byte.TryParse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out data[index])) { - data = null; return false; } +#endif } return true;