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 |
I'm doing:
~/gitconfig/hooks/pre-commit:
#!/bin/sh
if grep -q 'addCommandAlias("style",' build.sbt; then
exec sbt styleCheck
fi
exit 0
I ran once:
git config --global core.hooksPath ~/gitconfig/hooks
And in my projects build.sbt's I usually have:
addCommandAlias("style", "Compile/scalafix; Test/scalafix; Compile/scalafmt; Test/scalafmt; scalafmtSbt")
addCommandAlias("styleCheck", "Compile/scalafix --check; Test/scalafix --check; Compile/scalafmtCheck; Test/scalafmtCheck; scalafmtSbtCheck")
CI is also running:
sbt styleCheck
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi!
Since this is the first Google search result while searching for scala pre-commit, I'll leave here the script that we use (based on you implementation :D ) if it helps anyone :)
It checks the compilation, the scalastyle, and the test:scalastyle in 3 different steps in order to show which one has errors.