diff options
Diffstat (limited to 'tools/lint/hooks_js_format.py')
-rwxr-xr-x | tools/lint/hooks_js_format.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tools/lint/hooks_js_format.py b/tools/lint/hooks_js_format.py new file mode 100755 index 0000000000..1b0386685e --- /dev/null +++ b/tools/lint/hooks_js_format.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +# 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 +import subprocess +import sys +from subprocess import CalledProcessError, check_output + +here = os.path.dirname(os.path.realpath(__file__)) +topsrcdir = os.path.join(here, os.pardir, os.pardir) + +EXTRA_PATHS = ( + "python/mach", + "python/mozbuild", + "python/mozversioncontrol", + "testing/mozbase/mozfile", + "third_party/python/jsmin", +) +sys.path[:0] = [os.path.join(topsrcdir, p) for p in EXTRA_PATHS] + +from mozversioncontrol import InvalidRepoPath, get_repository_object + + +def run_js_format(hooktype, changedFiles): + try: + vcs = get_repository_object(topsrcdir) + except InvalidRepoPath: + return + + if not changedFiles: + # No files have been touched + return + + extensions = (".js", ".jsx", ".jsm", ".json", ".mjs", "sjs", "html", "xhtml") + path_list = [] + for filename in sorted(changedFiles): + # Ignore files unsupported in eslint and prettier + if filename.endswith(extensions): + path_list.append(filename) + + if not path_list: + # No files have been touched + return + + arguments = ["eslint", "--fix"] + path_list + # On windows we need this to call the command in a shell, see Bug 1511594 + if os.name == "nt": + js_format_cmd = ["sh", "mach"] + arguments + else: + js_format_cmd = [os.path.join(topsrcdir, "mach")] + arguments + if "commit" in hooktype: + # don't prevent commits, just display the eslint and prettier results + subprocess.call(js_format_cmd) + + vcs.add_remove_files(*path_list) + + return False + print("warning: '{}' is not a valid js-format hooktype".format(hooktype)) + return False + + +def git(): + hooktype = os.path.basename(__file__) + if hooktype == "hooks_js_format.py": + hooktype = "pre-push" + + try: + changedFiles = check_output( + ["git", "diff", "--staged", "--diff-filter=d", "--name-only", "HEAD"], + text=True, + ).split() + # TODO we should detect if we are in a "add -p" mode and show a warning + return run_js_format(hooktype, changedFiles) + + except CalledProcessError: + print("Command to retrieve local files failed") + return 1 + + +if __name__ == "__main__": + sys.exit(git()) |