From 5a88dcfdef957f468979f6bc0125f6204bb041b7 Mon Sep 17 00:00:00 2001 From: "Bobby R. Bruce" Date: Thu, 18 Aug 2022 16:08:37 -0700 Subject: [PATCH] scons: Update automatic hook install for pre-commit This replaces the old hooks with the pre-commit check. If Python pre-commit has not been installed an error is thrown asking the user to install the requirements via pip. Change-Id: I2d42f42624e10d38d0da39b473f0363db128ce1c Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/62553 Tested-by: kokoro Maintainer: Jason Lowe-Power Reviewed-by: Jason Lowe-Power Reviewed-by: Andreas Sandberg --- site_scons/site_tools/git.py | 54 +++++++----------------------------- util/pre-commit-install.sh | 43 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 44 deletions(-) create mode 100755 util/pre-commit-install.sh diff --git a/site_scons/site_tools/git.py b/site_scons/site_tools/git.py index 73007311be..1602aaad5d 100644 --- a/site_scons/site_tools/git.py +++ b/site_scons/site_tools/git.py @@ -38,17 +38,21 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +from asyncio import subprocess import os import sys +import subprocess import gem5_scons.util import SCons.Script git_style_message = """ -You're missing the gem5 style or commit message hook. These hooks help -to ensure that your code follows gem5's style rules on git commit. -This script will now install the hook in your .git/hooks/ directory. -Press enter to continue, or ctrl-c to abort: """ +You're missing the pre-commit/commit-msg hooks. These hook help to ensure your +code follows gem5's style rules on git commit and your commit messages follow +our commit message requirements. This script will now install these hooks in +your .git/hooks/ directory. +Press enter to continue, or ctrl-c to abort: +""" def install_style_hooks(env): @@ -68,42 +72,6 @@ def install_style_hooks(env): hook = git_hooks.File(hook_name) return hook.exists() - def hook_install(hook_name, script): - hook = git_hooks.File(hook_name) - if hook.exists(): - print( - "Warning: Can't install %s, hook already exists." % hook_name - ) - return - - if hook.islink(): - print("Warning: Removing broken symlink for hook %s." % hook_name) - os.unlink(hook.get_abspath()) - - if not git_hooks.exists(): - os.mkdir(git_hooks.get_abspath()) - git_hooks.clear() - - abs_symlink_hooks = git_hooks.islink() and os.path.isabs( - os.readlink(git_hooks.get_abspath()) - ) - - # Use a relative symlink if the hooks live in the source directory, - # and the hooks directory is not a symlink to an absolute path. - if hook.is_under(env.Dir("#")) and not abs_symlink_hooks: - script_path = os.path.relpath( - os.path.realpath(script.get_abspath()), - os.path.realpath(hook.Dir(".").get_abspath()), - ) - else: - script_path = script.get_abspath() - - try: - os.symlink(script_path, hook.get_abspath()) - except: - print("Error updating git %s hook" % hook_name) - raise - if hook_exists("pre-commit") and hook_exists("commit-msg"): return @@ -117,11 +85,9 @@ def install_style_hooks(env): print("Input exception, exiting scons.\n") sys.exit(1) - git_style_script = env.Dir("#util").File("git-pre-commit.py") - git_msg_script = env.Dir("#ext").File("git-commit-msg") + pre_commit_install = env.Dir("#util").File("pre-commit-install.sh") - hook_install("pre-commit", git_style_script) - hook_install("commit-msg", git_msg_script) + subprocess.call(str(pre_commit_install), shell=True) def generate(env): diff --git a/util/pre-commit-install.sh b/util/pre-commit-install.sh new file mode 100755 index 0000000000..7821d54494 --- /dev/null +++ b/util/pre-commit-install.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Copyright (c) 2022 The Regents of the University of California +# All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +GEM5_ROOT="${DIR}/.." + +cd ${GEM5_ROOT} + +if ! command -v pre-commit &> /dev/null +then + echo "Cannot find 'pre-commit'. Please ensure all Python requirements are " + echo "installed. This can be done via `pip install -r requirements.txt`." + exit 1 +fi + +pre-commit install -t pre-commit -t commit-msg