| #!/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 logging | |
| 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', | |
| 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 normpath(r, f): | |
| return os.path.normpath(os.path.join(r, f)) | |
| def listfiles(directory, exclude_patterns): | |
| for path in directory: | |
| logging.debug("Looking in: %s", 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): | |
| logging.debug(" -dir %s", normpath(root, d)) | |
| dirs.remove(d) | |
| # Filter out the files | |
| for f in fnmatch.filter(files, pattern): | |
| logging.debug("-file %s", normpath(root, f)) | |
| files.remove(f) | |
| for f in files: | |
| yield os.path.normpath(os.path.join(root, f)) | |
| def parse_excludes(exclude_name=os.path.join(TOPDIR, ".excludes")): | |
| exclude_patterns = [] | |
| with open(exclude_name, "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) | |
| return exclude_patterns | |
| def main(argv): | |
| args = parser.parse_args(argv[1:]) | |
| if args.verbose: | |
| logging.basicConfig(level=logging.DEBUG) | |
| logging.debug("Top level directory: %s", TOPDIR) | |
| exclude_patterns = args.exclude + parse_excludes() | |
| logging.debug("Exclude patterns: %s", exclude_patterns) | |
| logging.debug("Will search: %s", args.directory) | |
| for item in listfiles(args.directory, exclude_patterns): | |
| print(item) | |
| if __name__ == "__main__": | |
| sys.exit(main(sys.argv)) |