From f27ed522afcce1b653417a1b694f65e6700b0830 Mon Sep 17 00:00:00 2001 From: Reuben Morais Date: Fri, 12 Apr 2019 10:21:36 -0300 Subject: [PATCH] Git pre-commit hook instructions --- README.md | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10f77417..20bbaa27 100644 --- a/README.md +++ b/README.md @@ -371,7 +371,46 @@ pip install pylint cardboardlint cardboardlinter --refspec master ``` -This will compare the code against master and run the linter on all the changes. We plan to introduce more linter checks (e.g. for C++) in the future. +This will compare the code against master and run the linter on all the changes. We plan to introduce more linter checks (e.g. for C++) in the future. To run it automatically as a git pre-commit hook, do the following: + +```bash +cat <<\EOF > .git/hooks/pre-commit +#!/bin/bash +if [ ! -x "$(command -v cardboardlinter)" ]; then + exit 0 +fi + +# First, stash index and work dir, keeping only the +# to-be-committed changes in the working directory. +echo "Stashing working tree changes..." 1>&2 +old_stash=$(git rev-parse -q --verify refs/stash) +git stash save -q --keep-index +new_stash=$(git rev-parse -q --verify refs/stash) + +# If there were no changes (e.g., `--amend` or `--allow-empty`) +# then nothing was stashed, and we should skip everything, +# including the tests themselves. (Presumably the tests passed +# on the previous commit, so there is no need to re-run them.) +if [ "$old_stash" = "$new_stash" ]; then + echo "No changes, skipping lint." 1>&2 + exit 0 +fi + +# Run tests +cardboardlinter --refspec HEAD^ -n auto +status=$? + +# Restore changes +echo "Restoring working tree changes..." 1>&2 +git reset --hard -q && git stash apply --index -q && git stash drop -q + +# Exit with status from test-run: nonzero prevents commit +exit $status +EOF +chmod +x .git/hooks/pre-commit +``` + +This will run the linters on just the changes made in your commit. ## Contact/Getting Help