@@ -17,6 +17,7 @@ public void CanCompareTwoTreeEntries()
1717 using ( var repo = new Repository ( path ) )
1818 {
1919 var tree = repo . Lookup < Tree > ( sha ) ;
20+ Assert . False ( tree . IsMissing ) ;
2021 TreeEntry treeEntry1 = tree [ "README" ] ;
2122 TreeEntry treeEntry2 = tree [ "README" ] ;
2223 Assert . Equal ( treeEntry2 , treeEntry1 ) ;
@@ -31,6 +32,7 @@ public void CanConvertEntryToBlob()
3132 using ( var repo = new Repository ( path ) )
3233 {
3334 var tree = repo . Lookup < Tree > ( sha ) ;
35+ Assert . False ( tree . IsMissing ) ;
3436 TreeEntry treeEntry = tree [ "README" ] ;
3537
3638 var blob = treeEntry . Target as Blob ;
@@ -45,6 +47,7 @@ public void CanConvertEntryToTree()
4547 using ( var repo = new Repository ( path ) )
4648 {
4749 var tree = repo . Lookup < Tree > ( sha ) ;
50+ Assert . False ( tree . IsMissing ) ;
4851 TreeEntry treeEntry = tree [ "1" ] ;
4952
5053 var subtree = treeEntry . Target as Tree ;
@@ -59,6 +62,7 @@ public void CanEnumerateBlobs()
5962 using ( var repo = new Repository ( path ) )
6063 {
6164 var tree = repo . Lookup < Tree > ( sha ) ;
65+ Assert . False ( tree . IsMissing ) ;
6266
6367 IEnumerable < Blob > blobs = tree
6468 . Where ( e => e . TargetType == TreeEntryTargetType . Blob )
@@ -76,6 +80,7 @@ public void CanEnumerateSubTrees()
7680 using ( var repo = new Repository ( path ) )
7781 {
7882 var tree = repo . Lookup < Tree > ( sha ) ;
83+ Assert . False ( tree . IsMissing ) ;
7984
8085 IEnumerable < Tree > subTrees = tree
8186 . Where ( e => e . TargetType == TreeEntryTargetType . Tree )
@@ -93,6 +98,7 @@ public void CanEnumerateTreeEntries()
9398 using ( var repo = new Repository ( path ) )
9499 {
95100 var tree = repo . Lookup < Tree > ( sha ) ;
101+ Assert . False ( tree . IsMissing ) ;
96102 Assert . Equal ( tree . Count , tree . Count ( ) ) ;
97103
98104 Assert . Equal ( new [ ] { "1" , "README" , "branch_file.txt" , "new.txt" } , tree . Select ( te => te . Name ) . ToArray ( ) ) ;
@@ -106,6 +112,7 @@ public void CanGetEntryByName()
106112 using ( var repo = new Repository ( path ) )
107113 {
108114 var tree = repo . Lookup < Tree > ( sha ) ;
115+ Assert . False ( tree . IsMissing ) ;
109116 TreeEntry treeEntry = tree [ "README" ] ;
110117 Assert . Equal ( "a8233120f6ad708f843d861ce2b7228ec4e3dec6" , treeEntry . Target . Sha ) ;
111118 Assert . Equal ( "README" , treeEntry . Name ) ;
@@ -119,6 +126,7 @@ public void GettingAnUknownTreeEntryReturnsNull()
119126 using ( var repo = new Repository ( path ) )
120127 {
121128 var tree = repo . Lookup < Tree > ( sha ) ;
129+ Assert . False ( tree . IsMissing ) ;
122130 TreeEntry treeEntry = tree [ "I-do-not-exist" ] ;
123131 Assert . Null ( treeEntry ) ;
124132 }
@@ -131,6 +139,7 @@ public void CanGetEntryCountFromTree()
131139 using ( var repo = new Repository ( path ) )
132140 {
133141 var tree = repo . Lookup < Tree > ( sha ) ;
142+ Assert . False ( tree . IsMissing ) ;
134143 Assert . Equal ( 4 , tree . Count ) ;
135144 }
136145 }
@@ -142,6 +151,7 @@ public void CanReadEntryAttributes()
142151 using ( var repo = new Repository ( path ) )
143152 {
144153 var tree = repo . Lookup < Tree > ( sha ) ;
154+ Assert . False ( tree . IsMissing ) ;
145155 Assert . Equal ( Mode . NonExecutableFile , tree [ "README" ] . Mode ) ;
146156 }
147157 }
@@ -154,6 +164,7 @@ public void CanReadTheTreeData()
154164 {
155165 var tree = repo . Lookup < Tree > ( sha ) ;
156166 Assert . NotNull ( tree ) ;
167+ Assert . False ( tree . IsMissing ) ;
157168 }
158169 }
159170
@@ -165,6 +176,7 @@ public void TreeDataIsPresent()
165176 {
166177 GitObject tree = repo . Lookup ( sha ) ;
167178 Assert . NotNull ( tree ) ;
179+ Assert . False ( tree . IsMissing ) ;
168180 }
169181 }
170182
@@ -175,6 +187,7 @@ public void TreeUsesPosixStylePaths()
175187 {
176188 /* From a commit tree */
177189 var commitTree = repo . Lookup < Commit > ( "4c062a6" ) . Tree ;
190+ Assert . False ( commitTree . IsMissing ) ;
178191 Assert . NotNull ( commitTree [ "1/branch_file.txt" ] ) ;
179192 Assert . Null ( commitTree [ "1\\ branch_file.txt" ] ) ;
180193 }
@@ -188,6 +201,7 @@ public void CanRetrieveTreeEntryPath()
188201 {
189202 /* From a commit tree */
190203 var commitTree = repo . Lookup < Commit > ( "4c062a6" ) . Tree ;
204+ Assert . False ( commitTree . IsMissing ) ;
191205
192206 TreeEntry treeTreeEntry = commitTree [ "1" ] ;
193207 Assert . Equal ( "1" , treeTreeEntry . Path ) ;
@@ -201,6 +215,7 @@ public void CanRetrieveTreeEntryPath()
201215 // tree but exposes a complete path through its Path property
202216 var subTree = treeTreeEntry . Target as Tree ;
203217 Assert . NotNull ( subTree ) ;
218+ Assert . False ( subTree . IsMissing ) ;
204219 TreeEntry anInstance = subTree [ "branch_file.txt" ] ;
205220
206221 Assert . NotEqual ( "branch_file.txt" , anInstance . Path ) ;
@@ -239,6 +254,7 @@ public void CanParseSymlinkTreeEntries()
239254 . Add ( "A symlink" , linkContent , Mode . SymbolicLink ) ;
240255
241256 Tree t = repo . ObjectDatabase . CreateTree ( td ) ;
257+ Assert . False ( t . IsMissing ) ;
242258
243259 var te = t [ "A symlink" ] ;
244260
@@ -248,5 +264,31 @@ public void CanParseSymlinkTreeEntries()
248264 Assert . Equal ( linkContent , te . Target ) ;
249265 }
250266 }
267+
268+ [ Fact ]
269+ public void CanTellIfATreeIsMissing ( )
270+ {
271+ var path = SandboxBareTestRepo ( ) ;
272+
273+ // Manually delete the objects directory to simulate a partial clone
274+ Directory . Delete ( Path . Combine ( path , "objects" , "fd" ) , true ) ;
275+
276+ using ( var repo = new Repository ( path ) )
277+ {
278+ // Look up for the commit that reference the tree which is now missing
279+ var commit = repo . Lookup < Commit > ( "4a202b346bb0fb0db7eff3cffeb3c70babbd2045" ) ;
280+
281+ Assert . True ( commit . Tree . IsMissing ) ;
282+ Assert . Equal ( "fd093bff70906175335656e6ce6ae05783708765" , commit . Tree . Sha ) ;
283+ Assert . Throws < NotFoundException > ( ( ) => commit . Tree . Count ) ;
284+ Assert . Throws < NotFoundException > ( ( ) => commit . Tree . Count ( ) ) ;
285+ Assert . Throws < NotFoundException > ( ( ) => commit . Tree [ "README" ] ) ;
286+ Assert . Throws < NotFoundException > ( ( ) => commit . Tree . ToArray ( ) ) ;
287+ Assert . Throws < NotFoundException > ( ( ) =>
288+ {
289+ foreach ( var _ in commit . Tree ) { }
290+ } ) ;
291+ }
292+ }
251293 }
252294}
0 commit comments