[pisa-src] r1203 - in trunk/tools/subversion: pre-commit pre-commit-lib

  • From: Diego Biurrun <diego@xxxxxxxxxx>
  • To: pisa-src@xxxxxxxxxxxxx
  • Date: Thu, 15 Oct 2009 20:58:10 +0200

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
+}

Other related posts:

  • » [pisa-src] r1203 - in trunk/tools/subversion: pre-commit pre-commit-lib - Diego Biurrun