@@ -25,21 +25,48 @@ public void ResolveReference()
2525 refsHeadsDir . CreateFile ( "br1" ) . WriteAllText ( "ref: refs/heads/br2" ) ;
2626 refsHeadsDir . CreateFile ( "br2" ) . WriteAllText ( "ref: refs/heads/master" ) ;
2727
28- var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles ) ;
28+ using var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha1 ) ;
2929
3030 Assert . Equal ( "0123456789ABCDEFabcdef000000000000000000" , resolver . ResolveReference ( "0123456789ABCDEFabcdef000000000000000000" ) ) ;
3131
3232 Assert . Equal ( "0000000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/master" ) ) ;
3333 Assert . Equal ( "0000000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/br1" ) ) ;
3434 Assert . Equal ( "0000000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/br2" ) ) ;
3535
36- // branch without commits (emtpy repository) will have not file in refs/heads:
36+ // branch without commits (empty repository) will have not file in refs/heads:
3737 Assert . Null ( resolver . ResolveReference ( "ref: refs/heads/none" ) ) ;
3838
3939 Assert . Null ( resolver . ResolveReference ( "ref: refs/heads/rec1 " ) ) ;
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+ using var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha256 ) ;
59+
60+ // Verify SHA256 hash is accepted directly
61+ Assert . Equal (
62+ "0123456789ABCDEFabcdef00000000000000000000000000000000000000000000" ,
63+ resolver . ResolveReference ( "0123456789ABCDEFabcdef00000000000000000000000000000000000000000000" ) ) ;
64+
65+ Assert . Equal ( "0000000000000000000000000000000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/master" ) ) ;
66+ Assert . Equal ( "0000000000000000000000000000000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/br1" ) ) ;
67+ Assert . Equal ( "0000000000000000000000000000000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/br2" ) ) ;
68+ }
69+
4370 [ Fact ]
4471 public void ResolveReference_Errors ( )
4572 {
@@ -53,14 +80,24 @@ public void ResolveReference_Errors()
5380 refsHeadsDir . CreateFile ( "rec1" ) . WriteAllText ( "ref: refs/heads/rec2" ) ;
5481 refsHeadsDir . CreateFile ( "rec2" ) . WriteAllText ( "ref: refs/heads/rec1" ) ;
5582
56- var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles ) ;
83+ using var resolver1 = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha1 ) ;
84+
85+ Assert . Throws < InvalidDataException > ( ( ) => resolver1 . ResolveReference ( "ref: refs/heads/rec1" ) ) ;
86+ Assert . Throws < InvalidDataException > ( ( ) => resolver1 . ResolveReference ( "ref: xyz/heads/rec1" ) ) ;
87+ Assert . Throws < InvalidDataException > ( ( ) => resolver1 . ResolveReference ( "ref:refs/heads/rec1" ) ) ;
88+ Assert . Throws < InvalidDataException > ( ( ) => resolver1 . ResolveReference ( "refs/heads/rec1" ) ) ;
89+
90+ // Invalid SHA1 hash lengths
91+ Assert . Throws < InvalidDataException > ( ( ) => resolver1 . ResolveReference ( new string ( '0' , ObjectNameFormat . Sha1 . HashSize * 2 - 1 ) ) ) ;
92+ Assert . Throws < InvalidDataException > ( ( ) => resolver1 . ResolveReference ( new string ( '0' , ObjectNameFormat . Sha1 . HashSize * 2 + 1 ) ) ) ;
93+ Assert . Throws < InvalidDataException > ( ( ) => resolver1 . ResolveReference ( new string ( '0' , ObjectNameFormat . Sha256 . HashSize * 2 ) ) ) ;
5794
58- Assert . Throws < InvalidDataException > ( ( ) => resolver . ResolveReference ( "ref: refs/heads/rec1" ) ) ;
59- Assert . Throws < InvalidDataException > ( ( ) => resolver . ResolveReference ( "ref: xyz/heads/rec1" ) ) ;
60- Assert . Throws < InvalidDataException > ( ( ) => resolver . ResolveReference ( "ref:refs/heads/rec1" ) ) ;
61- Assert . Throws < InvalidDataException > ( ( ) => resolver . ResolveReference ( "refs/heads/rec1" ) ) ;
62- Assert . Throws < InvalidDataException > ( ( ) => resolver . ResolveReference ( new string ( '0' , 39 ) ) ) ;
63- Assert . Throws < InvalidDataException > ( ( ) => resolver . ResolveReference ( new string ( '0' , 41 ) ) ) ;
95+ using var resolver2 = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha256 ) ;
96+
97+ // Invalid SHA256 hash lengths
98+ Assert . Throws < InvalidDataException > ( ( ) => resolver2 . ResolveReference ( new string ( '0' , ObjectNameFormat . Sha256 . HashSize * 2 - 1 ) ) ) ;
99+ Assert . Throws < InvalidDataException > ( ( ) => resolver2 . ResolveReference ( new string ( '0' , ObjectNameFormat . Sha256 . HashSize * 2 + 1 ) ) ) ;
100+ Assert . Throws < InvalidDataException > ( ( ) => resolver2 . ResolveReference ( new string ( '0' , ObjectNameFormat . Sha1 . HashSize * 2 ) ) ) ;
64101 }
65102
66103 [ Fact ]
@@ -80,13 +117,38 @@ 2222222222222222222222222222222222222222 refs/heads/br2
80117
81118 refsHeadsDir . CreateFile ( "br1" ) . WriteAllText ( "ref: refs/heads/br2" ) ;
82119
83- var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles ) ;
120+ using var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha1 ) ;
84121
85122 Assert . Equal ( "1111111111111111111111111111111111111111" , resolver . ResolveReference ( "ref: refs/heads/master" ) ) ;
86123 Assert . Equal ( "2222222222222222222222222222222222222222" , resolver . ResolveReference ( "ref: refs/heads/br1" ) ) ;
87124 Assert . Equal ( "2222222222222222222222222222222222222222" , resolver . ResolveReference ( "ref: refs/heads/br2" ) ) ;
88125 }
89126
127+ [ Fact ]
128+ public void ResolveReference_Packed_SHA256 ( )
129+ {
130+ using var temp = new TempRoot ( ) ;
131+
132+ var gitDir = temp . CreateDirectory ( ) ;
133+
134+ // Packed refs with SHA256 hashes (64 characters)
135+ gitDir . CreateFile ( "packed-refs" ) . WriteAllText (
136+ @"# pack-refs with: peeled fully-peeled sorted
137+ 1111111111111111111111111111111111111111111111111111111111111111 refs/heads/master
138+ 2222222222222222222222222222222222222222222222222222222222222222 refs/heads/br2
139+ " ) ;
140+ var commonDir = temp . CreateDirectory ( ) ;
141+ var refsHeadsDir = commonDir . CreateDirectory ( "refs" ) . CreateDirectory ( "heads" ) ;
142+
143+ refsHeadsDir . CreateFile ( "br1" ) . WriteAllText ( "ref: refs/heads/br2" ) ;
144+
145+ using var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha256 ) ;
146+
147+ Assert . Equal ( "1111111111111111111111111111111111111111111111111111111111111111" , resolver . ResolveReference ( "ref: refs/heads/master" ) ) ;
148+ Assert . Equal ( "2222222222222222222222222222222222222222222222222222222222222222" , resolver . ResolveReference ( "ref: refs/heads/br1" ) ) ;
149+ Assert . Equal ( "2222222222222222222222222222222222222222222222222222222222222222" , resolver . ResolveReference ( "ref: refs/heads/br2" ) ) ;
150+ }
151+
90152 [ Fact ]
91153 public void ReadPackedReferences ( )
92154 {
@@ -101,7 +163,8 @@ 6666666666666666666666666666666666666666 y z
1011637777777777777777777777777777777777777777 refs/heads/br
102164" ;
103165
104- var actual = GitReferenceResolver . ReadPackedReferences ( new StringReader ( packedRefs ) , "<path>" ) ;
166+ using var resolver = new GitReferenceResolver ( TempRoot . Root , TempRoot . Root , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha1 ) ;
167+ var actual = resolver . ReadPackedReferences ( new StringReader ( packedRefs ) , "<path>" ) ;
105168
106169 AssertEx . SetEqual ( new [ ]
107170 {
@@ -110,26 +173,53 @@ 7777777777777777777777777777777777777777 refs/heads/br
110173 } , actual . Select ( e => $ "{ e . Key } :{ e . Value } ") ) ;
111174 }
112175
176+ [ Fact ]
177+ public void ReadPackedReferences_SHA256 ( )
178+ {
179+ var packedRefs =
180+ @"# pack-refs with:
181+ 1111111111111111111111111111111111111111111111111111111111111111 refs/heads/master
182+ 2222222222222222222222222222222222222222222222222222222222222222 refs/heads/br
183+ ^3333333333333333333333333333333333333333333333333333333333333333
184+ 4444444444444444444444444444444444444444444444444444444444444444 x
185+ 5555555555555555555555555555555555555555555555555555555555555555 y
186+ 6666666666666666666666666666666666666666666666666666666666666666 y z
187+ 7777777777777777777777777777777777777777777777777777777777777777 refs/heads/br
188+ " ;
189+
190+ using var resolver = new GitReferenceResolver ( TempRoot . Root , TempRoot . Root , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha256 ) ;
191+ var actual = resolver . ReadPackedReferences ( new StringReader ( packedRefs ) , "<path>" ) ;
192+
193+ AssertEx . SetEqual ( new [ ]
194+ {
195+ "refs/heads/br:2222222222222222222222222222222222222222222222222222222222222222" ,
196+ "refs/heads/master:1111111111111111111111111111111111111111111111111111111111111111"
197+ } , actual . Select ( e => $ "{ e . Key } :{ e . Value } ") ) ;
198+ }
199+
113200 [ Theory ]
114201 [ InlineData ( "# pack-refs with:" ) ]
115202 [ InlineData ( "# pack-refs with:xyz" ) ]
116203 [ InlineData ( "# pack-refs with:xyz\n " ) ]
117204 public void ReadPackedReferences_Empty ( string content )
118205 {
119- Assert . Empty ( GitReferenceResolver . ReadPackedReferences ( new StringReader ( content ) , "<path>" ) ) ;
206+ using var resolver = new GitReferenceResolver ( TempRoot . Root , TempRoot . Root , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha256 ) ;
207+ Assert . Empty ( resolver . ReadPackedReferences ( new StringReader ( content ) , "<path>" ) ) ;
120208 }
121209
122210 [ Theory ]
123211 [ InlineData ( "" ) ] // missing header
124212 [ InlineData ( "# pack-refs with" ) ] // invalid header prefix
125213 [ InlineData ( "# pack-refs with:xyz\n 1" ) ] // bad object id
214+ [ InlineData ( "# pack-refs with:xyz\n ^2222222222222222222222222222222222222222222222222222222222222222" ) ] // bad object id: sha256
126215 [ InlineData ( "# pack-refs with:xyz\n 1111111111111111111111111111111111111111" ) ] // no reference name
127216 [ InlineData ( "# pack-refs with:xyz\n ^1111111111111111111111111111111111111111" ) ] // tag dereference without previous ref
128217 [ InlineData ( "# pack-refs with:xyz\n 1111111111111111111111111111111111111111 x\n ^1" ) ] // bad object id
129218 [ InlineData ( "# pack-refs with:xyz\n ^1111111111111111111111111111111111111111\n ^2222222222222222222222222222222222222222" ) ] // tag dereference without previous ref
130219 public void ReadPackedReferences_Errors ( string content )
131220 {
132- Assert . Throws < InvalidDataException > ( ( ) => GitReferenceResolver . ReadPackedReferences ( new StringReader ( content ) , "<path>" ) ) ;
221+ using var resolver = new GitReferenceResolver ( TempRoot . Root , TempRoot . Root , ReferenceStorageFormat . LooseFiles , ObjectNameFormat . Sha1 ) ;
222+ Assert . Throws < InvalidDataException > ( ( ) => resolver . ReadPackedReferences ( new StringReader ( content ) , "<path>" ) ) ;
133223 }
134224
135225 [ Fact ]
@@ -150,7 +240,7 @@ public void ResolveReference_RefTable()
150240 var ref1 = refTableDir . CreateFile ( "1.ref" ) . WriteAllBytes ( GitRefTableTestWriter . GetRefTableBlob ( [ ( "refs/heads/a" , 0x01 ) , ( "refs/heads/c" , 0x02 ) ] ) ) ;
151241 TempFile ref2 ;
152242
153- using ( var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . RefTable ) )
243+ using ( var resolver = new GitReferenceResolver ( gitDir . Path , commonDir . Path , ReferenceStorageFormat . RefTable , ObjectNameFormat . Sha1 ) )
154244 {
155245 Assert . Equal ( "0100000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/a" ) ) ;
156246 Assert . Equal ( "0200000000000000000000000000000000000000" , resolver . ResolveReference ( "ref: refs/heads/c" ) ) ;
0 commit comments