The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.7 KiB
83 lines
2.7 KiB
#!/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()
|
|
|