Skip to content

Commit 236e1ce

Browse files
Copilottmat
andcommitted
Accept SHA256 hashes (64 characters) in addition to SHA1 hashes (40 characters)
Co-authored-by: tmat <41759+tmat@users.noreply.github.com>
1 parent d9765a6 commit 236e1ce

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

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

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,32 @@ public void ResolveReference()
4040
Assert.Null(resolver.ResolveReference("ref: refs/heads/none" + string.Join("/", Path.GetInvalidPathChars())));
4141
}
4242

43+
[Fact]
44+
public void ResolveReference_SHA256()
45+
{
46+
using var temp = new TempRoot();
47+
48+
var gitDir = temp.CreateDirectory();
49+
50+
var commonDir = temp.CreateDirectory();
51+
var refsHeadsDir = commonDir.CreateDirectory("refs").CreateDirectory("heads");
52+
53+
// SHA256 hash (64 characters)
54+
refsHeadsDir.CreateFile("master").WriteAllText("0000000000000000000000000000000000000000000000000000000000000000");
55+
refsHeadsDir.CreateFile("br1").WriteAllText("ref: refs/heads/br2");
56+
refsHeadsDir.CreateFile("br2").WriteAllText("ref: refs/heads/master");
57+
58+
var resolver = new GitReferenceResolver(gitDir.Path, commonDir.Path);
59+
60+
// Verify SHA256 hash is accepted directly
61+
Assert.Equal("0123456789ABCDEFabcdef00000000000000000000000000000000000000000000",
62+
resolver.ResolveReference("0123456789ABCDEFabcdef00000000000000000000000000000000000000000000"));
63+
64+
Assert.Equal("0000000000000000000000000000000000000000000000000000000000000000", resolver.ResolveReference("ref: refs/heads/master"));
65+
Assert.Equal("0000000000000000000000000000000000000000000000000000000000000000", resolver.ResolveReference("ref: refs/heads/br1"));
66+
Assert.Equal("0000000000000000000000000000000000000000000000000000000000000000", resolver.ResolveReference("ref: refs/heads/br2"));
67+
}
68+
4369
[Fact]
4470
public void ResolveReference_Errors()
4571
{
@@ -59,8 +85,12 @@ public void ResolveReference_Errors()
5985
Assert.Throws<InvalidDataException>(() => resolver.ResolveReference("ref: xyz/heads/rec1"));
6086
Assert.Throws<InvalidDataException>(() => resolver.ResolveReference("ref:refs/heads/rec1"));
6187
Assert.Throws<InvalidDataException>(() => resolver.ResolveReference("refs/heads/rec1"));
88+
// Invalid SHA1 hash lengths
6289
Assert.Throws<InvalidDataException>(() => resolver.ResolveReference(new string('0', 39)));
6390
Assert.Throws<InvalidDataException>(() => resolver.ResolveReference(new string('0', 41)));
91+
// Invalid SHA256 hash lengths
92+
Assert.Throws<InvalidDataException>(() => resolver.ResolveReference(new string('0', 63)));
93+
Assert.Throws<InvalidDataException>(() => resolver.ResolveReference(new string('0', 65)));
6494
}
6595

6696
[Fact]
@@ -87,6 +117,31 @@ 2222222222222222222222222222222222222222 refs/heads/br2
87117
Assert.Equal("2222222222222222222222222222222222222222", resolver.ResolveReference("ref: refs/heads/br2"));
88118
}
89119

120+
[Fact]
121+
public void ResolveReference_Packed_SHA256()
122+
{
123+
using var temp = new TempRoot();
124+
125+
var gitDir = temp.CreateDirectory();
126+
127+
// Packed refs with SHA256 hashes (64 characters)
128+
gitDir.CreateFile("packed-refs").WriteAllText(
129+
@"# pack-refs with: peeled fully-peeled sorted
130+
1111111111111111111111111111111111111111111111111111111111111111 refs/heads/master
131+
2222222222222222222222222222222222222222222222222222222222222222 refs/heads/br2
132+
");
133+
var commonDir = temp.CreateDirectory();
134+
var refsHeadsDir = commonDir.CreateDirectory("refs").CreateDirectory("heads");
135+
136+
refsHeadsDir.CreateFile("br1").WriteAllText("ref: refs/heads/br2");
137+
138+
var resolver = new GitReferenceResolver(gitDir.Path, commonDir.Path);
139+
140+
Assert.Equal("1111111111111111111111111111111111111111111111111111111111111111", resolver.ResolveReference("ref: refs/heads/master"));
141+
Assert.Equal("2222222222222222222222222222222222222222222222222222222222222222", resolver.ResolveReference("ref: refs/heads/br1"));
142+
Assert.Equal("2222222222222222222222222222222222222222222222222222222222222222", resolver.ResolveReference("ref: refs/heads/br2"));
143+
}
144+
90145
[Fact]
91146
public void ReadPackedReferences()
92147
{
@@ -110,6 +165,29 @@ 7777777777777777777777777777777777777777 refs/heads/br
110165
}, actual.Select(e => $"{e.Key}:{e.Value}"));
111166
}
112167

168+
[Fact]
169+
public void ReadPackedReferences_SHA256()
170+
{
171+
var packedRefs =
172+
@"# pack-refs with:
173+
1111111111111111111111111111111111111111111111111111111111111111 refs/heads/master
174+
2222222222222222222222222222222222222222222222222222222222222222 refs/heads/br
175+
^3333333333333333333333333333333333333333333333333333333333333333
176+
4444444444444444444444444444444444444444444444444444444444444444 x
177+
5555555555555555555555555555555555555555555555555555555555555555 y
178+
6666666666666666666666666666666666666666666666666666666666666666 y z
179+
7777777777777777777777777777777777777777777777777777777777777777 refs/heads/br
180+
";
181+
182+
var actual = GitReferenceResolver.ReadPackedReferences(new StringReader(packedRefs), "<path>");
183+
184+
AssertEx.SetEqual(new[]
185+
{
186+
"refs/heads/br:2222222222222222222222222222222222222222222222222222222222222222",
187+
"refs/heads/master:1111111111111111111111111111111111111111111111111111111111111111"
188+
}, actual.Select(e => $"{e.Key}:{e.Value}"));
189+
}
190+
113191
[Theory]
114192
[InlineData("# pack-refs with:")]
115193
[InlineData("# pack-refs with:xyz")]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,6 @@ internal static string ReadReferenceFromFile(string path)
255255
=> _lazyPackedReferences.Value.TryGetValue(reference, out var objectId) ? objectId : null;
256256

257257
private static bool IsObjectId(string reference)
258-
=> reference.Length == 40 && reference.All(CharUtils.IsHexadecimalDigit);
258+
=> (reference.Length == 40 || reference.Length == 64) && reference.All(CharUtils.IsHexadecimalDigit);
259259
}
260260
}

0 commit comments

Comments
 (0)