Bug 1563300 - Add a js-format git commit hook, r=sylvestre, CLOSED TREE
authorVictor Porof <vporof@mozilla.com>
Thu, 04 Jul 2019 14:50:06 +0200
changeset 541113 c7e91f614eb78c4447a623f1c88a66421113ab07
parent 541112 43a37d64c7626713c30efba2deb562304eeb4b5b
child 541114 602865e4e969900b82d0fc740fabd9ef34c01d2f
child 541186 2514efbfbb783ebbdbf6c84751e2c464a8d65d83
push id11533
push userarchaeopteryx@coole-files.de
push dateMon, 08 Jul 2019 18:18:03 +0000
treeherdermozilla-beta@f4452e031aed [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssylvestre, CLOSED
bugs1563300
milestone69.0a1
first release with
nightly linux32
c7e91f614eb7 / 69.0a1 / 20190705161030 / files
nightly linux64
c7e91f614eb7 / 69.0a1 / 20190705161030 / files
nightly mac
c7e91f614eb7 / 69.0a1 / 20190705161030 / files
nightly win32
c7e91f614eb7 / 69.0a1 / 20190705161030 / files
nightly win64
c7e91f614eb7 / 69.0a1 / 20190705161030 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1563300 - Add a js-format git commit hook, r=sylvestre, CLOSED TREE Differential Revision: https://phabricator.services.mozilla.com/D36816
tools/lint/hooks_js_format.py
new file mode 100755
--- /dev/null
+++ b/tools/lint/hooks_js_format.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# 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
+from subprocess import check_output, CalledProcessError
+import sys
+
+here = os.path.dirname(os.path.realpath(__file__))
+topsrcdir = os.path.join(here, os.pardir, os.pardir)
+
+EXTRA_PATHS = ("python/mozversioncontrol",)
+sys.path[:0] = [os.path.join(topsrcdir, p) for p in EXTRA_PATHS]
+
+from mozversioncontrol import get_repository_object, InvalidRepoPath
+
+
+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")
+    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)
+
+        # Add the modified files back to the repo (expect a string)
+        # one by one (fails otherwise, see bug #1541409)
+        for f in path_list:
+            vcs.add_remove_files(f)
+
+        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"]
+        ).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())