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