Hi!

This is no question. I just want to put this script into the net. Maybe it 
helps others too. I found it under the same topic name and made some changes 
(enhancements I would say :-)).

It helps that users enters comments and should prevent the tags folder from 
changes. Sometimes someone checksout the tags folders, makes a change and 
commits the change (what hopefully wasn't his intention).

The deletion of tags folders is allowed because people sometimes want to clean 
up old tags. And it's allowed to have a tags folder in your project beneath 
trunk and branches. Here a changes allowed.

This script has a weakness: it uses svnlook cat to determine wheter a change 
entry is a file or a directory. Mabay there is a better way to do this. When 
someone has a better solution for this it would be nice to mail it.

Have fun!

Two files a used:pre-commit and pre-commit.awk

File pre-commit:
#!/bin/sh
#taken from
#base idea taken from http://svn.haxx.se/users/archive-2005-11/0056.shtml
########################
# repository
########################
DIRNAME=`dirname $0`
REPOS="$1"
# Transaction
TXN="$2"
#svnlook binary
LOGFILE=/tmp/tx-svn-pre-commit-hook.txt
#LOGFILE=/dev/null
PATH=/usr/bin:/usr/local/bin:/opt/svn/product/svn/bin
AWK=gawk
########################
#debug
########################
transaction=`svnlook -t $TXN changed $REPOS` 2>&1
author=`svnlook author $REPOS`
echo "###################" >> $LOGFILE
echo "pre-commit executed `date`" >> $LOGFILE
echo "DIRNAME:$DIRNAME" >> $LOGFILE
echo "PATH:$PATH" >> $LOGFILE
echo "REPOS:$REPOS" >> $LOGFILE
echo "TXN:$TXN" >> $LOGFILE
echo "author:$author" >> $LOGFILE
echo "transaction:" >> $LOGFILE
echo "$transaction" >> $LOGFILE
##########################
# user 'god' can do anything
##########################
# User=`svnlook author -t $TXN $REPOS`
# if ( $User == "god" ){ exit 0 }
#################################
# Log message contains some text.
#################################
logmsg=`svnlook log -t $TXN $REPOS`
echo "logmsg:$logmsg" >> $LOGFILE
svnlook log -t $TXN $REPOS | \
   grep "[a-zA-Z0-9]" > /dev/null || { echo "Please write a meaningful 
comment!" >&2 ; exit 1 ; }
########################
# Protect tags directory
########################
# Deny transaction if any line writes to tags directory that exists.
# Get list of transactions in the 'tags' directory
TAGS_CHANGES=`svnlook changed -t $TXN $REPOS 2>/dev/null | \
                 $AWK -f $DIRNAME/pre-commit.awk 2>/dev/null`
echo "TAGS_CHANGES:" >> $LOGFILE
echo $TAGS_CHANGES >> $LOGFILE
# Get head revision number
YOUNGEST=`svnlook youngest $REPOS 2>/dev/null`
echo "YOUNGEST:$YOUNGEST" >> $LOGFILE
# For every line in transaction,
# check to see if directory in tags exists
for CHANGE in $TAGS_CHANGES; do
  CHANGE=`echo $CHANGE | sed -e "s/#!#/ /g"`
  echo "CHANGE:$CHANGE" >> $LOGFILE
  ERRORTEXT="Cannot modify existing tag: $CHANGE"
  # If directory in tags exists, deny transaction
  if svnlook proplist -r $YOUNGEST "$REPOS" "$CHANGE" >/dev/null 2>&1 ;
  then
    #echo "then branch" >> $LOGFILE
    #changes on directories should be allowd but not on files
    #svnlook cat -t $TXN $REPOS "$CHANGE" >> $LOGFILE 2>&1
    #echo "exitstatus:$?" >> $LOGFILE
    svnlook cat -t $TXN $REPOS "$CHANGE" > /dev/null 2>&1 && \
    { echo "$ERRORTEXT" >&2 ; exit 1 ; }
  else
    # don't allow adding/deleting a file
    #svnlook cat -t $TXN $REPOS "$CHANGE" >> $LOGFILE 2>&1
    #echo "exitstatus:$?" >> $LOGFILE
    svnlook cat -t $TXN $REPOS "$CHANGE" > /dev/null 2>&1 && \
    { echo "$ERRORTEXT" >&2 ; exit 1 ; }
    echo "exitstatus:$?" >> $LOGFILE
  fi
done
#######################
# Allow transaction
#######################
exit 0


File pre-commit.awk:
/  tags\/|\/tags\// {change=substr($0,5);
                     changecount=gsub(" ","#!#",change);
                     if ($0 !~ /trunk|branches/)
                        print change;
                    }


-- 
GMX DSL: Internet-, Telefon- und Handy-Flat ab 19,99 EUR/mtl.  
Bis zu 150 EUR Startguthaben inklusive! http://portal.gmx.net/de/go/dsl

Reply via email to