@@ -35,21 +35,25 @@ def init(self):
3535 self .parser_format .set_defaults (func = self .format )
3636
3737 @staticmethod
38- def _filter_lint_directories (dirnames : list [str ]):
38+ def _filter_lint_directories (
39+ dirpath : str , dirnames : list [str ], excludes : tuple [str ]
40+ ):
3941 # Skipping 3rd-party code - usually resides in subfolder "lib"
4042 if "lib" in dirnames :
4143 dirnames .remove ("lib" )
42- # Skipping hidden folders
44+ # Skipping hidden and excluded folders
4345 for dirname in dirnames .copy ():
4446 if dirname .startswith ("." ):
4547 dirnames .remove (dirname )
48+ if os .path .join (dirpath , dirname ).startswith (excludes ):
49+ dirnames .remove (dirname )
4650
47- def _check_folders (self , folders : list ):
51+ def _check_folders (self , folders : list , excludes : tuple [ str ] ):
4852 show_message = False
4953 pattern = re .compile (SOURCE_CODE_DIR_PATTERN )
5054 for folder in folders :
5155 for dirpath , dirnames , filenames in os .walk (folder ):
52- self ._filter_lint_directories (dirnames )
56+ self ._filter_lint_directories (dirpath , dirnames , excludes )
5357
5458 for dirname in dirnames :
5559 if not pattern .match (dirname ):
@@ -61,11 +65,11 @@ def _check_folders(self, folders: list):
6165 "Folders are not renamed automatically, please fix it by yourself"
6266 )
6367
64- def _find_sources (self , folders : list ):
68+ def _find_sources (self , folders : list , excludes : tuple [ str ] ):
6569 output = []
6670 for folder in folders :
6771 for dirpath , dirnames , filenames in os .walk (folder ):
68- self ._filter_lint_directories (dirnames )
72+ self ._filter_lint_directories (dirpath , dirnames , excludes )
6973
7074 for filename in filenames :
7175 ext = os .path .splitext (filename .lower ())[1 ]
@@ -168,14 +172,20 @@ def _apply_file_permissions(self, sources: list, dry_run: bool = False):
168172
169173 def _perform (self , dry_run : bool ):
170174 result = 0
171- sources = self ._find_sources (self .args .input )
175+ excludes = []
176+ for folder in self .args .input .copy ():
177+ if folder .startswith ("!" ):
178+ excludes .append (folder .removeprefix ("!" ))
179+ self .args .input .remove (folder )
180+ excludes = tuple (excludes )
181+ sources = self ._find_sources (self .args .input , excludes )
172182 if not self ._format_sources (sources , dry_run = dry_run ):
173183 result |= 0b001
174184 if not self ._apply_file_naming_convention (sources , dry_run = dry_run ):
175185 result |= 0b010
176186 if not self ._apply_file_permissions (sources , dry_run = dry_run ):
177187 result |= 0b100
178- self ._check_folders (self .args .input )
188+ self ._check_folders (self .args .input , excludes )
179189 return result
180190
181191 def check (self ):
0 commit comments