diff --git a/misc/scripts/svn/hooks/pre-commit b/misc/scripts/svn/hooks/pre-commit index 5c0e7aea84..d683f16317 100755 --- a/misc/scripts/svn/hooks/pre-commit +++ b/misc/scripts/svn/hooks/pre-commit @@ -5,37 +5,56 @@ TXN="$2" SVNLOOK=/usr/bin/svnlook -svn_cat() { - $SVNLOOK cat "$REPOS" -t "$TXN" $1 +svnl() { + cmd=$1 + shift + $SVNLOOK $cmd "$REPOS" -t "$TXN" $* } -all_changed_files=`$SVNLOOK changed "$REPOS" -t "$TXN" | \ - grep "^[AU]" | \ - sed 's/^....//'` - -# notice that breaking all_changed_files into several lines by replacing spaces -# with new lines only works as long as we don't have any files with spaces in -# them -- which is the case for now, but if it ever changes we'd probably need -# to use a shell array for all_changed_files or just rerun svnlook here again -changed_sources=`echo $all_changed_files | \ - sed 's/ /\n/g' | \ - egrep "\.(cpp|h|py)$" | \ - egrep -v "src/(tiff|regex|jpeg|stc/scintilla)"` - +set -e rc=0 -set -e +# exclude all third-party files from consideration, we don't want to do any +# checks for them +all_changed_files=`svnl changed | \ + grep "^[AU]" | \ + sed 's/^....//' | \ + egrep -v "src/(tiff|regex|jpeg|stc/scintilla)"` + +# analyze the changed files to find all non-binary and all source files +for f in $all_changed_files; do + mimetype=`svnl proplist -v $f | + fgrep "svn:mime-type" | + sed 's/^ svn:mime-type : //'` + case $mimetype in + ''|text/*) + ;; + + *) + continue + ;; + esac + + changed_text_files="$changed_text_files $f" + + case $f in + *.cpp|*.h|*.py) + changed_sources="$changed_sources $f" + ;; + esac +done for f in $changed_sources; do - if svn_cat $f | fgrep -q ' '; then + if svnl cat $f | fgrep -q ' '; then echo "Please remove TABs from $f before committing." >&2 rc=1 fi done -for f in $all_changed_files; do - if ! svn_cat $f | iconv -f utf8 -t WCHAR_T > /dev/null; then +for f in $changed_text_files; do + if ! svnl cat $f | iconv -f utf8 -t WCHAR_T > /dev/null; then echo "File $f doesn't use UTF-8, please convert it before committing." >&2 + echo "(or set svn:mime-type property correctly if the file is binary)." >&2 rc=1 fi done