#!/bin/bash
FPATTERN="\.\(php\|phpt\)$"
FLANG="PHP"
SYNTAX_CMD="php"
SYNTAX_ARGS="-l"
NOTIFY_SYNTAX="user@domain.tld"
NOTIFY_ERROR="user@domain.tld"
SYNTAX_LOG="/tmp/syntax.log"
BYPASSPW="change_this_syntax_bypass_password_please"
[ -z "$REPOS" ] && REPOS="$1"
[ -z "$TXN" ] && TXN="$2"
[ -z "$MODE" ] && if [ -n "$3" ]; then MODE="$3"; else MODE="-t"; fi
[ -z "$SVNLOOK" ] && SVNLOOK=svnlook
[ -z "$LOG" ] && LOG=`$SVNLOOK log $MODE "$TXN" "$REPOS"`
[ -z "$DIFF" ] && DIFF=`$SVNLOOK diff $MODE "$TXN" "$REPOS"`
[ -z "$AUTHOR" ] && AUTHOR=`$SVNLOOK author $MODE "$TXN" "$REPOS"`
[ -z "$CHANGEDFILES" ] && CHANGEDFILES=`$SVNLOOK changed $MODE "$TXN" "$REPOS"`
[ -n "$SYNTAXENABLED" ] && SYNTAXENABLED="1"
syntaxclean() {
[ -d $1 ] && rm -rf $1
}
syntaxexit() {
echo $1 >> /dev/stderr
echo $1 >> $SYNTAX_LOG
if [ -d $WORKING ]; then
[ -n "$DIFF" ] && echo $"$DIFF" > $WORKING/patch
[ -n "$LOG" ] && echo $"$LOG" > $WORKING/svnlog
[ -n "$CHANGED" ] && echo $"$CHANGED" > $WORKING/changed
mv $WORKING $WORKING.failed
fi
[ -n "$NOTIFY_ERROR" ] && echo "$1 ($WORKING.failed)" | mail -s "syntax commit failed" $NOTIFY_ERROR
[ -n $2 ] && syntaxclean $2
exit 1
}
function strlpad() {
STR="$1"
CHAR=$2
LEN=$3
L=${ D=$((LEN-L))
echo "$STR""`printf '%'$D's'| tr \ \"$CHAR\"`"
}
function errormessage() {
echo
HEADER=`strlpad "Error" "-" 76`
echo "|--$HEADER|" >&2
SPACES="`strlpad '' ' ' 78`"
echo "|$SPACES|" >&2
ERROR=`strlpad "$1" " " 77`
echo "| $ERROR|" >&2
echo "|$SPACES|" >&2
LINE=`strlpad "" "-" 78`
echo "|$LINE|" >&2
echo
}
if [ "$SYNTAXENABLED" == "1" ]; then
[[ "$LOG" =~ "$BYPASSPW" ]] && return;
NUMMATCHCHANGED=0
if [ -n "$CHANGEDFILES" ]; then
MATCHCHANGED=`echo $"$CHANGEDFILES" | grep "$FPATTERN"`
[ -n "$MATCHCHANGED" ] && NUMMATCHCHANGED=`echo $"$MATCHCHANGED" | wc -l`
fi
if [ $NUMMATCHCHANGED -gt 0 ]; then
WORKING=/tmp/$(basename $0).$$
[ -d $WORKING ] && rm -rf $WORKING
mkdir $WORKING || syntaxexit "failed to create temp dir for syntax check: $WORKING"
cd $WORKING
IFS=$'\n'
for LINE in $MATCHCHANGED; do
IFS=' '
WORDS=($LINE)
FSTATUS=${WORDS[0]}
FNAME=${WORDS[1]}
if [ "$FSTATUS" == "U" ] || [ "$FSTATUS" == "UU" ] || [ "$FSTATUS" == "A" ]; then
TMPFNAME=${FNAME//\//.}
$SVNLOOK cat $MODE "$TXN" "$REPOS" $FNAME > $TMPFNAME
file `which $SYNTAX_CMD` || syntaxexit "unablet to find systax command binary: $SYNTAX_CMD"
SYNTAXERROR=`$SYNTAX_CMD $SYNTAX_ARGS $TMPFNAME 2> $WORKING/$TMPFNAME.STDERR`
SYNTAXRETURN=$?
[ -s "$WORKING/$TMPFNAME.STDERR" ] && SYNTAXWARNING=`cat $WORKING/$TMPFNAME.STDERR`
if [ "$SYNTAXRETURN" -ne 0 ] || [ -n "$SYNTAXWARNING" ]; then
[ -n "$SYNTAXWARNING" ] && SYNTAXERROR=$SYNTAXWARNING
if [ "$FLANG" == "PHP" ]; then
SYNTAXERROR=`echo $SYNTAXERROR | sed -e 's/<[^<]*>//g' | cut -d',' -f 2`
SYNTAXERROR=`echo $SYNTAXERROR | sed -e 's/\(on line [0-9]* \)/\1\n/g'`
fi
ETMP=$WORKING/sloppy.txt
echo "$FLANG Syntax Error: $SYNTAXERROR" > $ETMP
echo >> $ETMP
echo Log: $LOG >> $ETMP
echo >> $ETMP
echo $"$DIFF" >> $ETMP
cat $ETMP | mail -s "SVN SYNTAX ERROR: $AUTHOR" $NOTIFY_SYNTAX
rm -f $ETMP
echo "$AUTHOR: $FLANG Syntax Error: $SYNTAXERROR" >> $SYNTAX_LOG
errormessage "$FLANG Syntax Error: $SYNTAXERROR"
syntaxclean $WORKING
exit 1
fi
fi
done
[ $? -ne 0 ] && exit 1
fi
syntaxclean $WORKING
fi