From 70823e30320ea1be2fce2d9b948438862e57eb65 Mon Sep 17 00:00:00 2001 From: Paul Rouget Date: Wed, 30 Oct 2019 09:41:00 +0100 Subject: [PATCH] Format CPP code with clang-format --- .../hololens/.clang-format => .clang-format | 0 python/servo/testing_commands.py | 52 +++++++++++++++++-- 2 files changed, 47 insertions(+), 5 deletions(-) rename support/hololens/.clang-format => .clang-format (100%) diff --git a/support/hololens/.clang-format b/.clang-format similarity index 100% rename from support/hololens/.clang-format rename to .clang-format diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py index c5a6e4cc6201..c92449cd047e 100644 --- a/python/servo/testing_commands.py +++ b/python/servo/testing_commands.py @@ -22,6 +22,7 @@ import base64 import shutil import subprocess +from xml.etree.ElementTree import XML from six import iteritems from mach.registrar import Registrar @@ -47,6 +48,8 @@ WEB_PLATFORM_TESTS_PATH = os.path.join("tests", "wpt", "web-platform-tests") SERVO_TESTS_PATH = os.path.join("tests", "wpt", "mozilla", "tests") +CLANGFMT_CPP_DIRS = ["support/hololens/"] + TEST_SUITES = OrderedDict([ ("tidy", {"kwargs": {"all_files": False, "no_progress": False, "self_test": False, "stylo": False}, @@ -323,7 +326,8 @@ def install_rustfmt(self): help="Run unit tests for tidy") @CommandArgument('--stylo', default=False, action="store_true", help="Only handle files in the stylo tree") - def test_tidy(self, all_files, no_wpt, no_progress, self_test, stylo): + @CommandArgument('--no-cpp', default=False, action="store_true", help="Skip CPP files") + def test_tidy(self, all_files, no_wpt, no_progress, self_test, stylo, no_cpp): if self_test: return test_tidy.do_tests() else: @@ -334,9 +338,21 @@ def test_tidy(self, all_files, no_wpt, no_progress, self_test, stylo): tidy_failed = tidy.scan(not all_files, not no_progress, stylo=stylo) self.install_rustfmt() rustfmt_failed = self.call_rustup_run(["cargo", "fmt", "--", "--check"]) - if rustfmt_failed: + + clangfmt_failed = False + if not no_cpp: + available, cmd, files = setup_clangfmt(all_files) + if available: + for file in files: + stdout = subprocess.check_output([cmd, "-output-replacements-xml", file]) + if len(XML(stdout)) > 0: + print("%s is not formatted correctly." % file) + clangfmt_failed = True + + if rustfmt_failed or clangfmt_failed: print("Run `./mach fmt` to fix the formatting") - return tidy_failed or manifest_dirty or rustfmt_failed + + return tidy_failed or manifest_dirty or rustfmt_failed or clangfmt_failed @Command('test-webidl', description='Run the WebIDL parser tests', @@ -458,9 +474,16 @@ def update_manifest(self, **kwargs): return run_update(self.context.topdir, **kwargs) @Command('fmt', - description='Format the Rust source files with rustfmt', + description='Format the Rust and CPP source files with rustfmt and clang-format', category='testing') - def format_code(self, **kwargs): + @CommandArgument('--no-cpp', default=False, action="store_true", help="Skip CPP files") + def format_code(self, no_cpp): + + if not no_cpp: + available, cmd, files = setup_clangfmt(True) + if available and len(files) > 0: + check_call([cmd, "-i"] + files) + self.install_rustfmt() return self.call_rustup_run(["cargo", "fmt"]) @@ -774,6 +797,25 @@ def create_parser_create(): return p +def setup_clangfmt(all_files): + cmd = "clang-format.exe" if sys.platform == "win32" else "clang-format" + try: + version = subprocess.check_output([cmd, "--version"]).rstrip() + print(version) + if not version.startswith("clang-format version 6."): + print("clang-format: wrong version (v6 required). Skipping CPP formatting.") + return False, None, None + except OSError: + print("clang-format not installed. Skipping CPP formatting.") + return False, None, None + gitcmd = ['git', 'ls-files'] + if not all_files: + gitcmd.append('-m') + gitfiles = subprocess.check_output(gitcmd + CLANGFMT_CPP_DIRS).splitlines() + filtered = [line for line in gitfiles if line.endswith(".h") or line.endswith(".cpp")] + return True, cmd, filtered + + @CommandProvider class WebPlatformTestsCreator(CommandBase): template_prefix = """