blob: c1cd04604da2d4921adefec11c1982b3986ad9a1 [file] [log] [blame] [edit]
#!/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))