Skip to content

Instantly share code, notes, and snippets.

@guillaumealgis
Created October 21, 2012 16:00
Show Gist options
  • Save guillaumealgis/3927352 to your computer and use it in GitHub Desktop.
Save guillaumealgis/3927352 to your computer and use it in GitHub Desktop.
Git Update Hook
#!/bin/bash
# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
branch=${refname#refs/heads/}
# Make a temp directory for writing the .jshintrc file
TMP_DIR=`mktemp -d`
EXIT_CODE=0
# See if the git repo has a .jshintrc file
JSHINTRC=`git ls-tree --full-tree --name-only -r $refname -- | egrep .jshintrc`
JSHINT="jshint"
if [ -n "$JSHINTRC" ]; then
# Create a path to a temp .jshintrc file
JSHINTRC_FILE="$TMP_DIR/`basename \"$JSHINTRC\"`"
# Write the repo file to the temp location
git cat-file blob $refname:$JSHINTRC > $JSHINTRC_FILE
# Update the JSHint command to use the configuration file
JSHINT="$JSHINT --config=$JSHINTRC_FILE"
fi
# Check all of the .js files that changed between oldrev and newrev
for FILE in `git diff --name-only -r ${oldrev} ${newrev} -- | egrep '.*\.js' | egrep -v '(.*vendors/.*|.*\.min\.js)'`; do
# Get just the path of the file
FILE_PATH=`dirname ${FILE}`
# Join that with the tmp directory; make if it does not exist
FULL_PATH=${TMP_DIR}/${FILE_PATH}
mkdir -p ${FULL_PATH}
# Write the file from Git
git cat-file blob ${newrev}:${FILE} > "$TMP_DIR/$FILE"
# Move to the tmp dir
OLD_CURRENT_DIR="$PWD"
cd $TMP_DIR
# Run JSHint on the file and redirect the output back to Git
${JSHINT} ${FILE} >&2
# Capture the exit status of last command
EXIT_CODE=$((${EXIT_CODE} + $?))
# Restore the last working directory
cd $OLD_CURRENT_DIR
done
# If the EXIT_CODE is not 0 fail
if [[ $EXIT_CODE -ne 0 ]]; then
rm -rf ${TMP_DIR}
echo ""
echo "JSHint detected syntax problems."
echo "Commit aborted."
exit $EXIT_CODE
fi
# Clean-up the created files
rm -rf ${TMP_DIR}
# Capture the exit status of last command
EXIT_CODE=$((${EXIT_CODE} + $?))
exit $EXIT_CODE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment