diff options
author | Batuhan Taskaya <isidentical@gmail.com> | 2020-01-26 20:09:35 +0300 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-01-27 19:09:19 +0100 |
commit | 09680b09b2f49e7a37d8b941822f053b5179bf6d (patch) | |
tree | 56fa37dd539aa2947426cbc46e29458f50faaba0 /bin | |
parent | 606baaeea69a3a8bb8c295cd692df8f6f30982bb (diff) |
tdf#123936: bin/find-clang-format.py for finding files to be formatted
- bin/find-clang-format.py created for finding ignored files that can
be formatted with clang-format, outputs to stdout with this format:
<path> (size: <diffsize>/<total file length>)
<diffsize>: amount of additions or removals, depends on which
one is bigger
- An environment variable can be used to set threshold (CLANG_THRESHOLD),
default for that variable is %5.
- Script automatically passes given arguments to the clang-format
Change-Id: I63651fdd1ed2d2354546726cac7560db4b77381f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87460
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/find-clang-format.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/bin/find-clang-format.py b/bin/find-clang-format.py new file mode 100755 index 000000000000..067b5b0899be --- /dev/null +++ b/bin/find-clang-format.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 + +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +from difflib import unified_diff +from pathlib import Path +from subprocess import PIPE, Popen + +BLACKLIST = Path("solenv/clang-format/blacklist") +THRESHOLD = os.getenv("CLANG_THRESHOLD", 5) +CLANG_BINARY = Path(os.getenv("CLANG_FORMAT", "/opt/lo/bin/clang-format")) + + +def calculate_diff_size(diff): + additions, removals = 0, 0 + # ignore first 2 item in the sequnece + # which are +++ and --- + for line in diff[2:]: + if line.startswith("+"): + additions += 1 + elif line.startswith("-"): + removals += 1 + return max((additions, removals)) + + +def format_stream(path, *extra_args): + process = Popen( + [CLANG_BINARY, *extra_args], stdout=PIPE, stderr=PIPE, stdin=PIPE, + ) + stdout, stderr = process.communicate(input=path.read_bytes()) + if stderr: + print("<FAIL>", str(path)) + print(stderr.decode()) + print("<FAIL>") + exit(1) + stdout = stdout.decode() + return stdout + + +def main(*args): + if not CLANG_BINARY.exists(): + print("Couldn't find clang-format on {!s}".format(CLANG_BINARY)) + exit(1) + + for path in BLACKLIST.read_text().splitlines(): + path = Path(path) + if not path.exists(): + continue + + original = path.read_text() + new = format_stream(path, *args) + originalsize = len(original.splitlines()) + diff = unified_diff(original.splitlines(), new.splitlines(), n=0) + diffsize = calculate_diff_size(tuple(diff)) + if diffsize <= (originalsize * 5) // 100: + print(path, "(size: {}/{})".format(diffsize, originalsize)) + + +if __name__ == "__main__": + import sys + + main(*sys.argv[1:]) |