|  | #!/usr/bin/env python3 | 
|  | """ | 
|  | Find all source files in the repo. | 
|  |  | 
|  | Excludes the files in the top level .excludes file. | 
|  | """ | 
|  |  | 
|  | import argparse | 
|  | import fnmatch | 
|  | import os.path | 
|  | import sys | 
|  |  | 
|  | from lib.argparse_extra import ActionStoreBool | 
|  |  | 
|  | MYFILE = os.path.abspath(__file__) | 
|  | MYDIR = os.path.dirname(MYFILE) | 
|  |  | 
|  | TOPDIR = os.path.abspath(os.path.join(MYDIR, "..")) | 
|  |  | 
|  | parser = argparse.ArgumentParser( | 
|  | description=__doc__, fromfile_prefix_chars='@', prefix_chars='-' | 
|  | ) | 
|  |  | 
|  | parser.add_argument( | 
|  | '--verbose', | 
|  | '--no-verbose', | 
|  | action=ActionStoreBool, | 
|  | default=os.environ.get('V', '') == '1', | 
|  | help="Print information about files ignored." | 
|  | ) | 
|  |  | 
|  | parser.add_argument( | 
|  | '--exclude', nargs="*", default=[], help="Extra exclude patterns to add." | 
|  | ) | 
|  |  | 
|  | parser.add_argument( | 
|  | 'directory', nargs="*", default=[TOPDIR], help="Directory to list from." | 
|  | ) | 
|  |  | 
|  |  | 
|  | def stderr(*args, **kw): | 
|  | print(*args, **kw, file=sys.stderr, flush=True) | 
|  |  | 
|  |  | 
|  | def normpath(r, f): | 
|  | return os.path.normpath(os.path.join(r, f)) | 
|  |  | 
|  |  | 
|  | def main(argv): | 
|  | global stderr | 
|  |  | 
|  | args = parser.parse_args(argv[1:]) | 
|  |  | 
|  | if not args.verbose: | 
|  | stderr = lambda *args, **kw: None  # noqa: E731 | 
|  |  | 
|  | stderr("Top level directory:", TOPDIR) | 
|  |  | 
|  | exclude_patterns = args.exclude | 
|  | with open(os.path.join(TOPDIR, ".excludes"), "r") as exclude_file: | 
|  | for line in exclude_file: | 
|  | # Strip comments | 
|  | if '#' in line: | 
|  | line = line[:line.find('#')] | 
|  |  | 
|  | # Strip whitespace | 
|  | line = line.strip() | 
|  |  | 
|  | # Skip empty lines | 
|  | if not line: | 
|  | continue | 
|  |  | 
|  | exclude_patterns.append(line) | 
|  |  | 
|  | stderr("Exclude patterns:", exclude_patterns) | 
|  | stderr("Will search:", args.directory) | 
|  | for path in args.directory: | 
|  | stderr("Looking in:", path) | 
|  | for root, dirs, files in os.walk(path, topdown=True): | 
|  | for pattern in exclude_patterns: | 
|  | # Filter out the directories we want to ignore | 
|  | for d in fnmatch.filter(dirs, pattern): | 
|  | stderr(" -dir", normpath(root, d)) | 
|  | dirs.remove(d) | 
|  |  | 
|  | for d in dirs: | 
|  | print(os.path.normpath(os.path.join(root, d))) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | sys.exit(main(sys.argv)) |