1#!/usr/bin/env python3
2#
3# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
4#
5# SPDX-License-Identifier: BSD-2-Clause
6#
7import argparse
8import fnmatch
9import re
10import sys
11
12# never run the tools on anything git
13DEFAULT_FILTERS = ["*.git/*"]
14
15# support comments alone and trailing (comment with #)
16COMMENT = re.compile(r'^\s*#')
17TRAILING_COMMENT = re.compile(r'\s+#.*$')
18
19
20def parse_filter(line: str):
21    """Parse a filter from a line of a filter file"""
22    line = line.strip()
23    if line and not COMMENT.search(line):
24        return TRAILING_COMMENT.sub('', line)
25    return None
26
27
28def parse_filters(filters_file: str):
29    """Parse the filter file, returning a list of filters"""
30    filters = DEFAULT_FILTERS
31    if filters_file:
32        try:
33            with open(filters_file, 'r') as outfile:
34                lines = outfile.readlines()
35                filters += [parse_filter(l) for l in lines if parse_filter(l)]
36        except IOError as exception:
37            logging.warning("Failed to open filter file %s: %s", filters_file, exception)
38    return filters
39
40def main():
41    parser = argparse.ArgumentParser("Filter files.")
42    parser.add_argument('-f', '--filters', type=str,
43            help='File with glob filters of files')
44    parser.add_argument('files', nargs='*', type=str,
45            help='List of files to be filtered')
46    args = parser.parse_args()
47
48    filters = parse_filters(args.filters)
49    for fname in args.files:
50        def matches(pattern, fname=fname):
51            return fnmatch.fnmatch(fname, pattern)
52        if not any(map(matches, filters)):
53            print(fname)
54
55if __name__ == '__main__':
56    sys.exit(main())
57