1162485Sjulian#!/usr/bin/env python3
2162485Sjulian#
3162485Sjulian# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
4162485Sjulian#
5162485Sjulian# SPDX-License-Identifier: BSD-2-Clause
6162485Sjulian#
7162485Sjulianimport argparse
8162485Sjulianimport fnmatch
9162485Sjulianimport re
10162485Sjulianimport sys
11162485Sjulian
12162485Sjulian# never run the tools on anything git
13162485SjulianDEFAULT_FILTERS = ["*.git/*"]
14162485Sjulian
15162485Sjulian# support comments alone and trailing (comment with #)
16162485SjulianCOMMENT = re.compile(r'^\s*#')
17162485SjulianTRAILING_COMMENT = re.compile(r'\s+#.*$')
18162485Sjulian
19162485Sjulian
20162485Sjuliandef parse_filter(line: str):
21162485Sjulian    """Parse a filter from a line of a filter file"""
22162485Sjulian    line = line.strip()
23162485Sjulian    if line and not COMMENT.search(line):
24162485Sjulian        return TRAILING_COMMENT.sub('', line)
25162485Sjulian    return None
26162485Sjulian
27162485Sjulian
28162485Sjuliandef parse_filters(filters_file: str):
29162485Sjulian    """Parse the filter file, returning a list of filters"""
30162485Sjulian    filters = DEFAULT_FILTERS
31162485Sjulian    if filters_file:
32162485Sjulian        try:
33162485Sjulian            with open(filters_file, 'r') as outfile:
34162485Sjulian                lines = outfile.readlines()
35162485Sjulian                filters += [parse_filter(l) for l in lines if parse_filter(l)]
36162485Sjulian        except IOError as exception:
37162485Sjulian            logging.warning("Failed to open filter file %s: %s", filters_file, exception)
38162485Sjulian    return filters
39162485Sjulian
40162485Sjuliandef main():
41162485Sjulian    parser = argparse.ArgumentParser("Filter files.")
42162485Sjulian    parser.add_argument('-f', '--filters', type=str,
43162485Sjulian            help='File with glob filters of files')
44162485Sjulian    parser.add_argument('files', nargs='*', type=str,
45162485Sjulian            help='List of files to be filtered')
46162485Sjulian    args = parser.parse_args()
47162485Sjulian
48162485Sjulian    filters = parse_filters(args.filters)
49162485Sjulian    for fname in args.files:
50162485Sjulian        def matches(pattern, fname=fname):
51162485Sjulian            return fnmatch.fnmatch(fname, pattern)
52162485Sjulian        if not any(map(matches, filters)):
53162485Sjulian            print(fname)
54162485Sjulian
55162485Sjulianif __name__ == '__main__':
56162485Sjulian    sys.exit(main())
57162485Sjulian