Author: biurrun Date: Thu Oct 15 20:58:10 2009 New Revision: 1203 Log: Add pre-commit check library from MPlayer / FFmpeg and use it to fend off commits with DOS linebreaks in them. Added: trunk/tools/subversion/pre-commit (contents, props changed) trunk/tools/subversion/pre-commit-lib Added: trunk/tools/subversion/pre-commit ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/tools/subversion/pre-commit Thu Oct 15 20:58:10 2009 (r1203) @@ -0,0 +1,69 @@ +#!/bin/sh + +# PRE-COMMIT HOOK +# +# The pre-commit hook is invoked before a Subversion txn is +# committed. Subversion runs this hook by invoking a program +# (script, executable, binary, etc.) named 'pre-commit' (for which +# this file is a template), with the following ordered arguments: +# +# [1] REPOS-PATH (the path to this repository) +# [2] TXN-NAME (the name of the txn about to be committed) +# +# The default working directory for the invocation is undefined, so +# the program should set one explicitly if it cares. +# +# If the hook program exits with success, the txn is committed; but +# if it exits with failure (non-zero), the txn is aborted, no commit +# takes place, and STDERR is returned to the client. The hook +# program can use the 'svnlook' utility to help it examine the txn. +# +# On a Unix system, the normal procedure is to have 'pre-commit' +# invoke other programs to do the real work, though it may do the +# work itself too. +# +# *** NOTE: THE HOOK PROGRAM MUST NOT MODIFY THE TXN, EXCEPT *** +# *** FOR REVISION PROPERTIES (like svn:log or svn:author). *** +# +# This is why we recommend using the read-only 'svnlook' utility. +# In the future, Subversion may enforce the rule that pre-commit +# hooks should not modify the versioned data in txns, or else come +# up with a mechanism to make it safe to do so (by informing the +# committing client of the changes). However, right now neither +# mechanism is implemented, so hook writers just have to be careful. +# +# Note that 'pre-commit' must be executable by the user(s) who will +# invoke it (typically the user httpd runs as), and that user must +# have filesystem-level permission to access the repository. +# +# On a Windows system, you should name the hook program +# 'pre-commit.bat' or 'pre-commit.exe', +# but the basic idea is the same. +# +# The hook program typically does not inherit the environment of +# its parent process. For example, a common problem is for the +# PATH environment variable to not be set to its usual value, so +# that subprograms fail to launch unless invoked via absolute path. +# If you're having unexpected problems with a hook program, the +# culprit may be unusual (or missing) environment variables. +# +# Here is an example hook script, for a Unix /bin/sh interpreter. +# For more examples and pre-written hooks, see those in +# the Subversion repository at +# http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/ and +# http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/ + + +REPOS="$1" +TXN="$2" + +. $REPOS/hooks/pre-commit-lib + +# Make sure that the log message contains some text. +check_log_message + +# Enforce some style guidelines on commits: DOS line endings are forbidden. +check_dos_linebreaks "" + +# All checks passed, so allow the commit. +exit 0 Added: trunk/tools/subversion/pre-commit-lib ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/tools/subversion/pre-commit-lib Thu Oct 15 20:58:10 2009 (r1203) @@ -0,0 +1,88 @@ +# shell library for pre-commit checks +# +# Copyright (c) 2009 Diego Biurrun <diego@xxxxxxxxxx> +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +SVNLOOK=/usr/bin/svnlook + +# Only stderr is passed on to the client. +echoerr () { + echo "$@" 1>&2 +} + +# Make sure that the log message contains some text. +check_log_message () { + if ! $SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null ; then + echoerr + echoerr "Your log message is empty." + echoerr "Commit aborted, fix the issue and try again." + exit 1 + fi +} + + +check_trailing_whitespace () { + for file in `$SVNLOOK changed -t "$TXN" "$REPOS" | egrep '^A|^U' | egrep -v '/$|\.diff$|\.patch$' | cut -c 5- | egrep "$@"` ; do + if ! $SVNLOOK propget -t "$TXN" "$REPOS" svn:mime-type "$file" 2> /dev/null ; then + if $SVNLOOK cat -t "$TXN" "$REPOS" "$file" | grep -e '[ ]$' > /dev/null ; then + echoerr + echoerr "Trailing whitespace found in $file." + echoerr "Commit aborted, fix the issue and try again." + exit 1 + fi + fi + done +} + + +check_ending_newline () { + for file in `$SVNLOOK changed -t "$TXN" "$REPOS" | egrep '^A|^U' | egrep -v '/$|\.diff$|\.patch$' | cut -c 5- | egrep "$@"` ; do + if ! $SVNLOOK propget -t "$TXN" "$REPOS" svn:mime-type "$file" 2> /dev/null ; then + if [ `$SVNLOOK cat -t "$TXN" "$REPOS" "$file" | tail -c1 | wc -l` = 0 ]; then + echoerr + echoerr "$file does not end in a newline." + echoerr "Commit aborted, fix the issue and try again." + exit 1 + fi + fi + done +} + + +check_tabs () { + for file in `$SVNLOOK changed -t "$TXN" "$REPOS" | cut -c 5- | egrep -v 'Makefile.*|common.mak|subdir.mak|clean-diff|\.diff|\.patch' | egrep "$@"` ; do + if ! $SVNLOOK propget -t "$TXN" "$REPOS" svn:mime-type "$file" 2> /dev/null ; then + if $SVNLOOK cat -t "$TXN" "$REPOS" "$file" | grep -e ' ' > /dev/null; then + echoerr + echoerr "Tabs found in $file." + echoerr "Commit aborted, fix the issue and try again." + exit 1 + fi + fi + done +} + + +check_dos_linebreaks () { + for file in `$SVNLOOK changed -t "$TXN" "$REPOS" | cut -c 5- | egrep "$@"` ; do + if ! $SVNLOOK propget -t "$TXN" "$REPOS" svn:mime-type "$file" 2> /dev/null ; then + if $SVNLOOK cat -t "$TXN" "$REPOS" "$file" | grep -q ' $' 2> /dev/null; then + echoerr + echoerr "DOS linebreaks found in $file." + echoerr "Commit aborted, fix the issue and try again." + exit 1 + fi + fi + done +}