@@ -142,6 +142,17 @@ public void CanAddAnExistingGitLinkTreeEntryDefinition()
142142 }
143143 }
144144
145+ private const string StringOf40Chars = "0123456789012345678901234567890123456789" ;
146+
147+ /// <summary>
148+ /// Used to verify that windows path limitation to 260 chars is not limiting the size of
149+ /// the keys present in the object database.
150+ /// </summary>
151+ private const string StringOf600Chars =
152+ StringOf40Chars + StringOf40Chars + StringOf40Chars + StringOf40Chars + StringOf40Chars
153+ + StringOf40Chars + StringOf40Chars + StringOf40Chars + StringOf40Chars + StringOf40Chars
154+ + StringOf40Chars + StringOf40Chars + StringOf40Chars + StringOf40Chars + StringOf40Chars ;
155+
145156 [ Theory ]
146157 [ InlineData ( "README" , "README_TOO" ) ]
147158 [ InlineData ( "README" , "1/README" ) ]
@@ -152,7 +163,10 @@ public void CanAddAnExistingGitLinkTreeEntryDefinition()
152163 [ InlineData ( "1/branch_file.txt" , "1/2/3/another_one.txt" ) ]
153164 [ InlineData ( "1" , "2" ) ]
154165 [ InlineData ( "1" , "2/3" ) ]
155- public void CanAddAnExistingTreeEntry ( string sourcePath , string targetPath )
166+ [ InlineData ( "1" , "C:\\ /10" ) ]
167+ [ InlineData ( "1" , " : * ? \" < > |" ) ]
168+ [ InlineData ( "1" , StringOf600Chars ) ]
169+ public void CanAddAndRemoveAnExistingTreeEntry ( string sourcePath , string targetPath )
156170 {
157171 string path = SandboxBareTestRepo ( ) ;
158172 using ( var repo = new Repository ( path ) )
@@ -168,6 +182,36 @@ public void CanAddAnExistingTreeEntry(string sourcePath, string targetPath)
168182 Assert . NotNull ( fetched ) ;
169183
170184 Assert . Equal ( te . Target . Id , fetched . TargetId ) ;
185+
186+ // Ensuring that the object database can handle uncommon paths.
187+ var newTree = repo . ObjectDatabase . CreateTree ( td ) ;
188+ Assert . Equal ( newTree [ targetPath ] . Target . Id , te . Target . Id ) ;
189+
190+ td . Remove ( targetPath ) ;
191+ Assert . Null ( td [ targetPath ] ) ;
192+ }
193+ }
194+
195+ [ Theory ]
196+ [ InlineData ( "C:\\ " ) ]
197+ [ InlineData ( " : * ? \" \n < > |" ) ]
198+ [ InlineData ( "a\\ b" ) ]
199+ [ InlineData ( "\\ \\ b\a " ) ]
200+ [ InlineData ( "éàµ" ) ]
201+ [ InlineData ( StringOf600Chars ) ]
202+ public void TreeNamesCanContainCharsForbiddenOnSomeOS ( string targetName )
203+ {
204+ string path = SandboxBareTestRepo ( ) ;
205+ using ( var repo = new Repository ( path ) )
206+ {
207+ var pointedItem = repo . Head . Tip . Tree ;
208+
209+ var td = new TreeDefinition ( ) ;
210+ td . Add ( targetName , pointedItem ) ;
211+
212+ var newTree = repo . ObjectDatabase . CreateTree ( td ) ;
213+ Assert . Equal ( newTree [ targetName ] . Target . Sha , pointedItem . Sha ) ;
214+ Assert . Equal ( newTree [ targetName ] . Name , targetName ) ;
171215 }
172216 }
173217
0 commit comments