lint.py: add option to only check tracked files

develop
lethosor 2021-09-06 18:59:08 -04:00
parent 11222f21d3
commit 5dfb633db8
No known key found for this signature in database
GPG Key ID: 76A269552F4F58C1
2 changed files with 51 additions and 31 deletions

@ -147,7 +147,7 @@ jobs:
# don't need tags here # don't need tags here
- name: Check whitespace - name: Check whitespace
run: | run: |
python ci/lint.py --github-actions python ci/lint.py --git-only --github-actions
- name: Check Authors.rst - name: Check Authors.rst
if: success() || failure() if: success() || failure()
run: | run: |

@ -3,6 +3,7 @@ import argparse
import fnmatch import fnmatch
import re import re
import os import os
import subprocess
import sys import sys
DFHACK_ROOT = os.path.normpath(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 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] 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): def main(args):
root_path = os.path.abspath(args.path) root_path = os.path.abspath(args.path)
if not os.path.exists(args.path): if not os.path.exists(args.path):
@ -118,9 +134,11 @@ def main(args):
check_patterns = load_pattern_files(args.check_patterns) check_patterns = load_pattern_files(args.check_patterns)
ignore_patterns = load_pattern_files(args.ignore_patterns) ignore_patterns = load_pattern_files(args.ignore_patterns)
for cur, dirnames, filenames in os.walk(root_path): walk_iter = walk_all
for filename in filenames: if args.git_only:
full_path = os.path.join(cur, filename) walk_iter = walk_git_files
for full_path in walk_iter(root_path):
rel_path = full_path.replace(root_path, '').replace('\\', '/').lstrip('/') rel_path = full_path.replace(root_path, '').replace('\\', '/').lstrip('/')
if not valid_file(rel_path, check_patterns, ignore_patterns): if not valid_file(rel_path, check_patterns, ignore_patterns):
continue continue
@ -163,6 +181,8 @@ if __name__ == '__main__':
help='Path to scan (default: current directory)') help='Path to scan (default: current directory)')
parser.add_argument('--fix', action='store_true', parser.add_argument('--fix', action='store_true',
help='Attempt to modify files in-place to fix identified issues') 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', parser.add_argument('--github-actions', action='store_true',
help='Enable GitHub Actions workflow command output') help='Enable GitHub Actions workflow command output')
parser.add_argument('-v', '--verbose', action='store_true', parser.add_argument('-v', '--verbose', action='store_true',