diff options
author | Marshall Greenblatt <magreenblatt@gmail.com> | 2017-05-18 14:50:10 +0200 |
---|---|---|
committer | Marshall Greenblatt <magreenblatt@gmail.com> | 2017-05-18 16:23:53 +0200 |
commit | 99931b268a11609c6236ed2e026d0783c2105322 (patch) | |
tree | 7a50cfd506698cead13f1ec9db6ebe68091b0afe /tools/fix_style.py | |
parent | 4e31e664ff130d00b67d25b46554e1808aba267c (diff) | |
download | jcef-99931b268a11609c6236ed2e026d0783c2105322.tar.gz |
Update tooling to use clang-format (issue #272)
Diffstat (limited to 'tools/fix_style.py')
-rw-r--r-- | tools/fix_style.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/tools/fix_style.py b/tools/fix_style.py new file mode 100644 index 0000000..11b41d1 --- /dev/null +++ b/tools/fix_style.py @@ -0,0 +1,114 @@ +# Copyright (c) 2017 The Chromium Embedded Framework Authors. +# Portions copyright (c) 2011 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os, re, sys +from clang_util import clang_format +from file_util import * +from git_util import get_changed_files + +# Valid extensions for files we want to clang-format. +DEFAULT_LINT_WHITELIST_REGEX = r"(.*\.cpp|.*\.cc|.*\.h|.*\.mm)$" +DEFAULT_LINT_BLACKLIST_REGEX = r"$^" + +IGNORE_DIRECTORIES = ["binary_distrib", "jcef_build", "out", "third_party", + "tools"] + +def msg(filename, status): + if sys.platform == 'win32': + # Use Unix path separator. + filename = filename.replace("\\", "/") + + if len(filename) > 60: + # Truncate the file path in a nice way. + filename = filename[-57:] + pos = filename.find("/") + if pos > 0: + filename = filename[pos:] + filename = "..." + filename + + print "%-60s %s" % (filename, status) + +updatect = 0 +def update_file(filename): + oldcontents = read_file(filename) + if len(oldcontents) == 0: + msg(filename, "empty") + return; + + newcontents = clang_format(oldcontents) + if newcontents is None: + raise Exception("Failed to process %s" % filename) + + if newcontents != oldcontents: + msg(filename, "fixed") + global updatect + updatect += 1 + write_file(filename, newcontents) + else: + msg(filename, "ok") + return + +def fix_style(filenames, white_list = None, black_list = None): + """ Execute clang-format with the specified arguments. """ + if not white_list: + white_list = DEFAULT_LINT_WHITELIST_REGEX + white_regex = re.compile(white_list) + if not black_list: + black_list = DEFAULT_LINT_BLACKLIST_REGEX + black_regex = re.compile(black_list) + + for filename in filenames: + # Ignore files from specific directories. + ignore = False + for dir_part in filename.split(os.sep): + if dir_part in IGNORE_DIRECTORIES: + msg(filename, "ignored") + ignore = True + break + if ignore: + continue + + if filename.find('*') > 0: + # Expand wildcards. + filenames.extend(get_files(filename)) + continue + + if os.path.isdir(filename): + # Add directory contents. + filenames.extend(get_files(os.path.join(filename, "*"))) + continue + + if not os.path.exists(filename): + files = get_changed_files(".", filename) + if len(files) > 0: + filenames.extend(files) + else: + msg(filename, "missing") + continue + + if white_regex.match(filename): + if black_regex.match(filename): + msg(filename, "ignored") + else: + update_file(filename) + else: + msg(filename, "skipped") + +if __name__ == "__main__": + if len(sys.argv) == 1: + print "Usage: %s [file-path|git-hash|unstaged|staged] ..." % sys.argv[0] + print "\n Format C, C++ and ObjC files using Chromium's clang-format style." + print "\nOptions:" + print " file-path\tProcess the specified file or directory." + print " \t\tDirectories will be processed recursively." + print " \t\tThe \"*\" wildcard character is supported." + print " git-hash\tProcess all files changed in the specified Git commit." + print " unstaged\tProcess all unstaged files in the Git repo." + print " staged\t\tProcess all staged files in the Git repo." + sys.exit(1) + + # Process anything passed on the command-line. + fix_style(sys.argv[1:]) + print 'Done - Wrote %d files.' % updatect |