@@ -152,22 +152,21 @@ def __repr__(self):
152152 return '<git.Tree "%s">' % self .id
153153
154154 @classmethod
155- def _iter_recursive (cls , repo , tree , cur_depth , max_depth , predicate ):
155+ def _iter_recursive (cls , repo , tree , cur_depth , max_depth , predicate , prune ):
156156
157157 for obj in tree :
158158 # adjust path to be complete
159159 obj .path = os .path .join (tree .path , obj .path )
160- if not predicate (obj ):
161- continue
162- yield obj
163- if obj .type == "tree" and ( max_depth < 0 or cur_depth + 1 <= max_depth ):
164- for recursive_obj in cls ._iter_recursive ( repo , obj , cur_depth + 1 , max_depth , predicate ):
160+ if predicate (obj ):
161+ yield obj
162+ if obj .type == "tree" and ( max_depth < 0 or cur_depth + 1 <= max_depth ) and not prune (obj ):
163+ for recursive_obj in cls ._iter_recursive ( repo , obj , cur_depth + 1 , max_depth , predicate , prune ):
165164 yield recursive_obj
166165 # END for each recursive object
167166 # END if we may enter recursion
168167 # END for each object
169168
170- def traverse (self , max_depth = - 1 , predicate = lambda i : True ):
169+ def traverse (self , max_depth = - 1 , predicate = lambda i : True , prune = lambda t : False ):
171170 """
172171 Returns
173172
@@ -183,8 +182,13 @@ def traverse(self, max_depth=-1, predicate = lambda i: True):
183182 ``predicate``
184183
185184 If predicate(item) returns True, item will be returned by iterator
185+
186+ ``prune``
187+
188+ If prune(tree) returns True, the traversal will not continue into the
189+ given tree object.
186190 """
187- return self ._iter_recursive ( self .repo , self , 0 , max_depth , predicate )
191+ return self ._iter_recursive ( self .repo , self , 0 , max_depth , predicate , prune )
188192
189193 @property
190194 def trees (self ):
0 commit comments