@@ -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" ) ]
0 commit comments