#!/usr/bin/env python3 import argparse import fnmatch import itertools import os import pathlib import sys parser = argparse.ArgumentParser( "ignore-filter", description="Filter files from stdin using a .gitignore-style filter file", ) parser.add_argument("filename", nargs="+", help="The filter file", type=str) args = parser.parse_args() ignore_patterns = list() for f in args.filename: if not os.path.exists(f): raise RuntimeError(f"File {args.filename} does not exist.") with open(f, "r") as ignore_file: for line in [i.strip() for i in ignore_file.readlines()]: # Ignore comments. if line.startswith("#"): continue # Drop leading "/" or "./" ( this isn't 100% correct for # .gitignore format) . if line.startswith("/"): line = line[1:] elif line.startswith("./"): line = line[2:] ignore_patterns.append(line) for c in sys.stdin: candidate = c.strip() match = False for seg in itertools.accumulate( pathlib.PurePath(candidate).parts, os.path.join ): if any(fnmatch.fnmatch(seg, i) for i in ignore_patterns): match = True break if not match: print(candidate)