Skip to content

Instantly share code, notes, and snippets.

@cvogt
Created June 16, 2015 19:27
Show Gist options
  • Save cvogt/2676ed6c6d1abafa3d6a to your computer and use it in GitHub Desktop.
Save cvogt/2676ed6c6d1abafa3d6a to your computer and use it in GitHub Desktop.

Revisions

  1. cvogt created this gist Jun 16, 2015.
    5 changes: 5 additions & 0 deletions pre-commit-hook-install.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    #!/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
    72 changes: 72 additions & 0 deletions pre-commit-hook.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,72 @@
    #!/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