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