aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2022-11-15 18:12:41 -0500
committerDylan Baker <dylan@pnwbakers.com>2022-12-05 12:33:17 -0800
commitce120ff164e67eb526ecfe70bf87bbb94050bc52 (patch)
tree18f2d6c83b9a16600232e5c8a18c656852f63237
parentbb875280b695b8d0435833c192f99233e74a522a (diff)
downloadmeson-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.py12
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