#!/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()