Skip to content

Instantly share code, notes, and snippets.

@adujardin
Forked from hartfordfive/pre-receive-puppet
Last active November 23, 2017 09:06
Show Gist options
  • Save adujardin/b8c5d96968d2261e5c85d795269ec8ee to your computer and use it in GitHub Desktop.
Save adujardin/b8c5d96968d2261e5c85d795269ec8ee to your computer and use it in GitHub Desktop.
Server-side pre-receive hook to check for merge artefacts such as '<<<<<<<' or '>>>>>>>'
#!/usr/bin/env bash
# pre-receive hook that check for merge artefacts such as '<<<<<<<' or '>>>>>>>'
# Possible improvements : https://gist.github.com/hartfordfive/9670011#gistcomment-2045250
COMMAND="grep -RI '<<<<<<<\|>>>>>>>'"
TEMPDIR=`mktemp -d`
# See https://www.kernel.org/pub/software/scm/git/docs/githooks.html#pre-receive
oldrev=$1
newrev=$2
refname=$3
while read oldrev newrev refname; do
# Get the file names, without directory, of the files that have been modified
# between the new revision and the old revision
files=`git diff --name-only ${oldrev} ${newrev}`
# Get a list of all objects in the new revision
objects=`git ls-tree --full-name -r ${newrev}`
# Iterate over each of these files
for file in ${files}; do
# Search for the file name in the list of all objects
object=`echo -e "${objects}" | egrep "(\s)${file}\$" | awk '{ print $3 }'`
# If it's not present, then continue to the the next itteration
if [ -z ${object} ];
then
continue;
fi
# Otherwise, create all the necessary sub directories in the new temp directory
mkdir -p "${TEMPDIR}/`dirname ${file}`" &>/dev/null
# and output the object content into it's original file name
git cat-file blob ${object} > ${TEMPDIR}/${file}
done;
done
# Now loop over each file in the temp dir to parse them for valid syntax
files_found=`find ${TEMPDIR} -type f` # -name '*'`
for fname in ${files_found}; do
result="$(eval "${COMMAND} ${fname} | wc -l")"
#echo "${result}"
if [[ "$result" != "0" ]]; then
name=${fname#$TEMPDIR}
name=${name#"/"}
echo "************************************************************************"
echo "** ERROR: Incomplete merge artefacts detected in '${name}'"
echo "************************************************************************"
bad_file=1
fi
done;
rm -rf ${TEMPDIR} &> /dev/null
if [[ $bad_file -eq 1 ]]
then
exit 1
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment