diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-03-09 13:15:06 -0500 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2021-03-16 21:01:54 -0400 |
commit | f55868927721f273640a3ba7a8e703d418a352b6 (patch) | |
tree | 813740324e90910f74f57a797b7f933b3ebc2776 /mesonbuild/scripts | |
parent | a45f939092cc2c60d49040bdb0147758a1403f61 (diff) | |
download | meson-f55868927721f273640a3ba7a8e703d418a352b6.zip meson-f55868927721f273640a3ba7a8e703d418a352b6.tar.gz meson-f55868927721f273640a3ba7a8e703d418a352b6.tar.bz2 |
clangformat: Add include and ignore files
Diffstat (limited to 'mesonbuild/scripts')
-rw-r--r-- | mesonbuild/scripts/clangformat.py | 50 |
1 files changed, 39 insertions, 11 deletions
diff --git a/mesonbuild/scripts/clangformat.py b/mesonbuild/scripts/clangformat.py index 062cb43..2cf757f 100644 --- a/mesonbuild/scripts/clangformat.py +++ b/mesonbuild/scripts/clangformat.py @@ -12,38 +12,66 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pathlib import subprocess +import itertools +import fnmatch +from pathlib import Path from concurrent.futures import ThreadPoolExecutor from ..environment import detect_clangformat from ..compilers import lang_suffixes import typing as T -def clangformat(exelist: T.List[str], srcdir_name: str, builddir_name: str) -> int: - srcdir = pathlib.Path(srcdir_name) +def parse_pattern_file(fname: Path) -> T.List[str]: + patterns = [] + try: + with fname.open(encoding='utf-8') as f: + for line in f: + pattern = line.strip() + if pattern and not pattern.startswith('#'): + patterns.append(pattern) + except FileNotFoundError: + pass + return patterns + +def run_clang_format(exelist: T.List[str], fname: Path) -> subprocess.CompletedProcess: + before = fname.stat().st_mtime + ret = subprocess.run(exelist + ['-style=file', '-i', str(fname)]) + after = fname.stat().st_mtime + if before != after: + print('File reformatted: ', fname) + return ret + +def clangformat(exelist: T.List[str], srcdir: Path, builddir: Path) -> int: + patterns = parse_pattern_file(srcdir / '.clang-format-include') + if not patterns: + patterns = ['**/*'] + globs = [srcdir.glob(p) for p in patterns] + patterns = parse_pattern_file(srcdir / '.clang-format-ignore') + ignore = [str(builddir / '*')] + ignore.extend([str(srcdir / p) for p in patterns]) suffixes = set(lang_suffixes['c']).union(set(lang_suffixes['cpp'])) suffixes.add('h') + suffixes = set([f'.{s}' for s in suffixes]) futures = [] returncode = 0 with ThreadPoolExecutor() as e: - for f in (x for suff in suffixes for x in srcdir.glob('**/*.' + suff)): - if f.is_dir(): - continue + for f in itertools.chain(*globs): strf = str(f) - if strf.startswith(builddir_name): + if f.is_dir() or f.suffix not in suffixes or \ + any(fnmatch.fnmatch(strf, i) for i in ignore): continue - futures.append(e.submit(subprocess.run, exelist + ['-style=file', '-i', strf])) + futures.append(e.submit(run_clang_format, exelist, f)) returncode = max([x.result().returncode for x in futures]) return returncode def run(args: T.List[str]) -> int: - srcdir_name = args[0] - builddir_name = args[1] + srcdir = Path(args[0]) + builddir = Path(args[1]) exelist = detect_clangformat() if not exelist: print('Could not execute clang-format "%s"' % ' '.join(exelist)) return 1 - return clangformat(exelist, srcdir_name, builddir_name) + return clangformat(exelist, srcdir, builddir) |