|
|
|
@ -3,6 +3,7 @@ import argparse
|
|
|
|
|
import fnmatch
|
|
|
|
|
import re
|
|
|
|
|
import os
|
|
|
|
|
import subprocess
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
DFHACK_ROOT = os.path.normpath(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
@ -109,6 +110,21 @@ class TabLinter(Linter):
|
|
|
|
|
|
|
|
|
|
linters = [cls() for cls in Linter.__subclasses__() if not cls.ignore]
|
|
|
|
|
|
|
|
|
|
def walk_all(root_path):
|
|
|
|
|
for cur, dirnames, filenames in os.walk(root_path):
|
|
|
|
|
for filename in filenames:
|
|
|
|
|
full_path = os.path.join(cur, filename)
|
|
|
|
|
yield full_path
|
|
|
|
|
|
|
|
|
|
def walk_git_files(root_path):
|
|
|
|
|
p = subprocess.Popen(['git', '-C', root_path, 'ls-files', root_path], stdout=subprocess.PIPE)
|
|
|
|
|
for line in p.stdout.readlines():
|
|
|
|
|
path = line.decode('utf-8').strip()
|
|
|
|
|
full_path = os.path.join(root_path, path)
|
|
|
|
|
yield full_path
|
|
|
|
|
if p.wait() != 0:
|
|
|
|
|
raise RuntimeError('git exited with %r' % p.returncode)
|
|
|
|
|
|
|
|
|
|
def main(args):
|
|
|
|
|
root_path = os.path.abspath(args.path)
|
|
|
|
|
if not os.path.exists(args.path):
|
|
|
|
@ -118,9 +134,11 @@ def main(args):
|
|
|
|
|
check_patterns = load_pattern_files(args.check_patterns)
|
|
|
|
|
ignore_patterns = load_pattern_files(args.ignore_patterns)
|
|
|
|
|
|
|
|
|
|
for cur, dirnames, filenames in os.walk(root_path):
|
|
|
|
|
for filename in filenames:
|
|
|
|
|
full_path = os.path.join(cur, filename)
|
|
|
|
|
walk_iter = walk_all
|
|
|
|
|
if args.git_only:
|
|
|
|
|
walk_iter = walk_git_files
|
|
|
|
|
|
|
|
|
|
for full_path in walk_iter(root_path):
|
|
|
|
|
rel_path = full_path.replace(root_path, '').replace('\\', '/').lstrip('/')
|
|
|
|
|
if not valid_file(rel_path, check_patterns, ignore_patterns):
|
|
|
|
|
continue
|
|
|
|
@ -163,6 +181,8 @@ if __name__ == '__main__':
|
|
|
|
|
help='Path to scan (default: current directory)')
|
|
|
|
|
parser.add_argument('--fix', action='store_true',
|
|
|
|
|
help='Attempt to modify files in-place to fix identified issues')
|
|
|
|
|
parser.add_argument('--git-only', action='store_true',
|
|
|
|
|
help='Only check files tracked by git')
|
|
|
|
|
parser.add_argument('--github-actions', action='store_true',
|
|
|
|
|
help='Enable GitHub Actions workflow command output')
|
|
|
|
|
parser.add_argument('-v', '--verbose', action='store_true',
|
|
|
|
|