diff options
author | Eli Schwartz <eschwartz@archlinux.org> | 2022-11-15 18:12:41 -0500 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2022-12-05 12:33:17 -0800 |
commit | ce120ff164e67eb526ecfe70bf87bbb94050bc52 (patch) | |
tree | 18f2d6c83b9a16600232e5c8a18c656852f63237 | |
parent | bb875280b695b8d0435833c192f99233e74a522a (diff) | |
download | meson-ce120ff164e67eb526ecfe70bf87bbb94050bc52.zip meson-ce120ff164e67eb526ecfe70bf87bbb94050bc52.tar.gz meson-ce120ff164e67eb526ecfe70bf87bbb94050bc52.tar.bz2 |
on newer versions of clang-format, use builtin --check handling
Due to a deficiency in upstream clang-format, our automatic target for
`ninja clang-format-check` runs clang-format, then compares the bytes of
the file before and after to see if anything changed. If it did change,
we rewrite the file back to its original form and error out.
Since clang-format 10, there is an option to report warnings instead of
writing the reformatted file, and also, to make those warnings fatal.
This is a much better user experience, to see *what* is wrong, not just
that something is wrong, and also gets rid of a pretty gross "modify
your files when you didn't ask for it" behavior that is vulnerable to
getting interrupted.
Let's switch over to the new approach, if we can.
-rw-r--r-- | mesonbuild/scripts/clangformat.py | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/mesonbuild/scripts/clangformat.py b/mesonbuild/scripts/clangformat.py index 9dc5466..f2f6a77 100644 --- a/mesonbuild/scripts/clangformat.py +++ b/mesonbuild/scripts/clangformat.py @@ -18,17 +18,25 @@ from pathlib import Path from .run_tool import run_tool from ..environment import detect_clangformat +from ..mesonlib import version_compare +from ..programs import ExternalProgram import typing as T def run_clang_format(fname: Path, exelist: T.List[str], check: bool) -> subprocess.CompletedProcess: + clangformat_10 = False if check: - original = fname.read_bytes() + cformat_ver = ExternalProgram('clang-format', exelist).get_version() + if version_compare(cformat_ver, '>=10'): + clangformat_10 = True + exelist = exelist + ['--dry-run', '--Werror'] + else: + original = fname.read_bytes() 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) - if check: + if check and not clangformat_10: # Restore the original if only checking. fname.write_bytes(original) ret.returncode = 1 |