Commentaires commit et filtre contenu SVN

De EjnTricks

Cet article présente comment forcer l'entrée d'un commentaire lors d'un commit, et d'empêcher l'ajout de fichiers d'un certain type. Il faut créer un script pre-commit dans le répertoire hooks du projet.

Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote

Dans le cadre de cet exemple, le script est mis en place dans une arborescence commune.


Command-icon.png Mise en place

Pour forcer la présence d'un message, , il faut donc créer un script exécutable pre-commit, dans le répertoire /var/opt/svn/common/hooks.

-rwxrwxr-x 1 www-data subversion 3738 2010-09-18 11:21 pre-commit

Le contenu de celui ci est le suivant.

#!/bin/bash

# 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)
#
#   [STDIN] LOCK-TOKENS ** the lock tokens are passed via STDIN.
#
#   If STDIN contains the line "LOCK-TOKENS:\n" (the "\n" denotes a
#   single newline), the lines following it are the lock tokens for
#   this commit.  The end of the list is marked by a line containing
#   only a newline character.
#
#   Each lock token line consists of a URI-escaped path, followed
#   by the separator character '|', followed by the lock token string,
#   followed by a newline.
#
# 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
# /usr/share/subversion/hook-scripts, and in the 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"

# Define ending function
# expecting error message and error code
show_error_message() {
   echo $1 1>&2;
   exit $2;
}

# load global configuration file if exists
GLOBAL_CONFIGURATION_FILE="/var/subversion/exclude.list"
if [ -f $GLOBAL_CONFIGURATION_FILE ];
then
   . $GLOBAL_CONFIGURATION_FILE
else 
   exclude=('Thumbs.db' '*.log' '*.bak' '*.old' '.project' '\*.\*~')
fi

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook

# fetch the author username
AUTHOR=`$SVNLOOK author -t "$TXN" "$REPOS"`

EXCLUDE_COUNT=${#exclude[@]}
INDEX=0
# check if there is no exclude file
while [ "$INDEX" -lt "$EXCLUDE_COUNT" ]
do
   REGULAR="^A \+.\+${exclude[$INDEX]}"
   $SVNLOOK changed -t "$TXN" "$REPOS" | grep ${REGULAR}$ > /dev/null
   if test $? -eq 0;
   then
      show_error_message "$AUTHOR, You cannot add files of this kind (${exclude[$INDEX]})" 3
   fi
   let "INDEX = $INDEX + 1"
done

$SVNLOOK log -t "$TXN" "$REPOS" | \
   grep "[a-zA-Z0-9]" > /dev/null || show_error_message "$AUTHOR, You must specify a message in your commit" 1

# Exit on all errors.
set -e

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
#"$REPOS"/hooks/commit-access-control.pl "$REPOS" $TXN \
#  "$REPOS"/hooks/commit-access-control.cfg

# All checks passed, so allow the commit.
exit 0


Study icon.png Explications

Icon Personnalisation.png Personnalisation messages

Afin de personnaliser un peu plus les messages, le nom de la personne est récupéré pour être utilisé dans les messages d'erreur

# fetch the author username
AUTHOR=`$SVNLOOK author -t "$TXN" "$REPOS"`

Forbidden-icon.png Obligation de messages

Dans ce script, la partie suivante est responsable du caractère obligatoire du commentaire:

$SVNLOOK log -t "$TXN" "$REPOS" | \
   grep "[a-zA-Z0-9]" > /dev/null || show_error_message "$AUTHOR, You must specify a message in your commit" 1

Delete-file-icon.png Filtre contenu

La partie suivante est responsable du filtre sur le type de document

# load global configuration file if exists
GLOBAL_CONFIGURATION_FILE="/var/subversion/exclude.list"
if [ -f $GLOBAL_CONFIGURATION_FILE ];
then
   . $GLOBAL_CONFIGURATION_FILE
else 
   exclude=('Thumbs.db' '*.log' '*.bak' '*.old' '.project' '\*.\*~')
fi

EXCLUDE_COUNT=${#exclude[@]}
INDEX=0
# check if there is no exclude file
while [ "$INDEX" -lt "$EXCLUDE_COUNT" ]
do
   REGULAR="^A \+.\+${exclude[$INDEX]}"
   $SVNLOOK changed -t "$TXN" "$REPOS" | grep ${REGULAR}$ > /dev/null
   if test $? -eq 0;
   then
      show_error_message "$AUTHOR, You cannot add files of this kind (${exclude[$INDEX]})" 3
   fi
   let "INDEX = $INDEX + 1"
done

Les types à exclure peuvent être configurés dans une fichier externe, représenté par le fichier GLOBAL_CONFIGURATION_FILE, mais cela n'a pas été mis en place.


Run-icon.png Activation

Dans le cas d'un dépôt /var/opt/svn/study, un lien est mis en place.

#sudo ln -s /var/opt/svn/common/hooks/pre-commit /var/opt/svn/study/hooks/pre-commit
#sudo chown -h www-data:subversion /var/opt/svn/study/hooks/pre-commit