@@ -388,19 +388,38 @@ def is_ignored(self, path: str) -> Optional[bool]:
388388 return matches [- 1 ].is_exclude
389389 return None
390390
391- def walk (self , ** kwargs ) -> Generator [tuple [str , list [str ], list [str ]], None , None ]:
392- """Wrap os.walk() without ignored files and subdirectories and kwargs are passed to walk."""
391+ def walk_with_ignored (
392+ self , ** kwargs
393+ ) -> Generator [tuple [str , list [str ], list [str ], list [str ], list [str ]], None , None ]:
394+ """Wrap os.walk() and also return lists of ignored directories and files.
395+
396+ Yields tuples: (dirpath, included_dirnames, included_filenames, ignored_dirnames, ignored_filenames)
397+ """
393398 for dirpath , dirnames , filenames in os .walk (self .path , topdown = True , ** kwargs ):
394399 rel_dirpath = '' if dirpath == self .path else os .path .relpath (dirpath , self .path )
395400
401+ original_dirnames = list (dirnames )
402+ included_dirnames = []
403+ ignored_dirnames = []
404+ for d in original_dirnames :
405+ if self .is_ignored (os .path .join (rel_dirpath , d )):
406+ ignored_dirnames .append (d )
407+ else :
408+ included_dirnames .append (d )
409+
396410 # decrease recursion depth of os.walk() by ignoring subdirectories because of topdown=True
397411 # slicing ([:]) is mandatory to change dict in-place!
398- dirnames [:] = [ d for d in dirnames if not self . is_ignored ( os . path . join ( rel_dirpath , d ))]
412+ dirnames [:] = included_dirnames
399413
400- # remove ignored files
401- filenames = [f for f in filenames if not self .is_ignored (os .path .join (rel_dirpath , f ))]
414+ included_filenames = []
415+ ignored_filenames = []
416+ for f in filenames :
417+ if self .is_ignored (os .path .join (rel_dirpath , f )):
418+ ignored_filenames .append (f )
419+ else :
420+ included_filenames .append (f )
402421
403- yield dirpath , dirnames , filenames
422+ yield dirpath , dirnames , included_filenames , ignored_dirnames , ignored_filenames
404423
405424 @classmethod
406425 def build (
0 commit comments