Created
June 16, 2015 19:27
-
-
Save cvogt/2676ed6c6d1abafa3d6a to your computer and use it in GitHub Desktop.
git pre-commit hook for Scala compile and format checking (put both in your git project root, needs to be installed in each clone)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
cd "$(dirname "$0")" | |
touch .git/hooks/pre-commit | |
rm .git/hooks/pre-commit | |
ln -s ../../pre-commit-hook.sh .git/hooks/pre-commit |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# checks if locally staged changes are | |
# formatted properly. Ignores non-staged | |
# changes. | |
# Intended as git pre-commit hook | |
_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) | |
DIR=$( echo $_DIR | sed 's/\/.git\/hooks$//' ) | |
echo "" | |
echo "Running pre-commit hook ... (you can omit this with --no-verify, but don't)" | |
git diff --quiet | |
hadNoNonStagedChanges=$? | |
if ! [ $hadNoNonStagedChanges -eq 0 ] | |
then | |
echo "* Stashing non-staged changes" | |
git stash --keep-index -u > /dev/null | |
fi | |
echo "* Compiling/formatting staged changes" | |
$DIR/sbt ";test:compile;format" > /dev/null | |
compiles=$? | |
echo "* Compiles?" | |
if [ $compiles -eq 0 ] | |
then | |
echo "* Yes!" | |
echo "* Properly formatted?" | |
git diff --quiet | |
formatted=$? | |
if [ $formatted -eq 0 ] | |
then | |
echo "* Yes!" | |
else | |
echo "* No!" | |
echo "The following files need formatting (in stage or commited):" | |
git diff --name-only | |
echo "" | |
fi | |
else | |
echo "* No!" | |
fi | |
echo "* Undoing formatting" | |
git stash --keep-index > /dev/null | |
git stash drop > /dev/null | |
if ! [ $hadNoNonStagedChanges -eq 0 ] | |
then | |
echo "* Scheduling stash pop of previously stashed non-staged changes for 1 second after commit" | |
sleep 1 && git stash pop --index > /dev/null & # sleep and & otherwise commit fails when this leads to a merge conflict | |
fi | |
if [ $compiles -eq 0 ] && [ $formatted -eq 0 ] | |
then | |
echo "... done. Proceeding with commit." | |
exit 0 | |
elif [ $compiles -eq 0 ] | |
then | |
echo "... done." | |
echo "CANCELLING commit due to NON-FORMATTED CODE." | |
exit 1 | |
else | |
echo "... done." | |
echo "CANCELLING commit due to COMPILE ERROR." | |
exit 2 | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm doing:
~/gitconfig/hooks/pre-commit:
I ran once:
git config --global core.hooksPath ~/gitconfig/hooks
And in my projects build.sbt's I usually have:
CI is also running: