| #!/usr/bin/env python3 | |
| # SPDX-License-Identifier: Apache-2.0 | |
| # Copyright 2012-2019 The Meson development team | |
| # some simple checks on the file format of: | |
| # - python code | |
| # - code samples in tests | |
| # - markdown documentation | |
| # | |
| # checks are: | |
| # - no use of tabs | |
| # - no use of DOS line endings | |
| import os | |
| import re | |
| from pathlib import Path | |
| def check_file(file: Path) -> None: | |
| lines = file.read_bytes().split(b'\n') | |
| tabdetector = re.compile(br' *\t') | |
| for i, line in enumerate(lines): | |
| if re.match(tabdetector, line): | |
| raise SystemExit("File {} contains a tab indent on line {:d}. Only spaces are permitted.".format(file, i + 1)) | |
| if line.endswith(b'\r'): | |
| raise SystemExit("File {} contains DOS line ending on line {:d}. Only unix-style line endings are permitted.".format(file, i + 1)) | |
| def check_format() -> None: | |
| check_suffixes = {'.c', | |
| '.cpp', | |
| '.cxx', | |
| '.cc', | |
| '.rs', | |
| '.f90', | |
| '.vala', | |
| '.d', | |
| '.s', | |
| '.m', | |
| '.mm', | |
| '.asm', | |
| '.java', | |
| '.txt', | |
| '.py', | |
| '.swift', | |
| '.build', | |
| '.md', | |
| } | |
| skip_dirs = { | |
| '.dub', # external deps are here | |
| '.pytest_cache', | |
| 'meson-logs', 'meson-private', | |
| 'work area', | |
| '.eggs', '_cache', # e.g. .mypy_cache | |
| 'venv', # virtualenvs have DOS line endings | |
| '120 rewrite', # we explicitly test for tab in meson.build file | |
| '3 editorconfig', | |
| } | |
| for (root, _, filenames) in os.walk('.'): | |
| if any([x in root for x in skip_dirs]): | |
| continue | |
| for fname in filenames: | |
| file = Path(fname) | |
| if file.suffix.lower() in check_suffixes: | |
| if file.name in ('sitemap.txt', 'meson-test-run.txt'): | |
| continue | |
| check_file(root / file) | |
| def check_symlinks(): | |
| # Test data must NOT contain symlinks. setup.py | |
| # butchers them. If you need symlinks, they need | |
| # to be created on the fly. | |
| for f in Path('test cases').glob('**/*'): | |
| if f.is_symlink(): | |
| if 'boost symlinks/boost/lib' in str(f): | |
| continue | |
| raise SystemExit(f'Test data dir contains symlink: {f}.') | |
| if __name__ == '__main__': | |
| script_dir = os.path.split(__file__)[0] | |
| if script_dir != '': | |
| os.chdir(script_dir) | |
| check_format() | |
| check_symlinks() |