Outils pour utilisateurs

Outils du site


user:pascal_cabaud:sysadmin:rvi

Contrôle de version du pauvre avec RCS et vi(1)

RCS est vieillissant mais fait encore bien le job. En suivant une idée trouvée dans la FAQ de Squid, voici un script à utiliser en lieu et place de votre éditeur favori :

$ cat rvi
#!/bin/ksh
#
# Pascal Cabaud
# Universite Paris Diderot

RIGHTS=`stat -f %Op $1 | cut -c3-`
OWNER=`stat -f %u:%g $1`

date=`date +%Y%m%d.%H%M%S`

dir=`dirname $1`
file=`basename $1`
if [ ! -d $dir/RCS ]; then
	mkdir -p $dir/RCS
	if [ -f $dir/$file,v -a -d $dir/RCS ]; then
		mv $dir/$file,v $dir/RCS
	fi
fi

if [ -f $dir/RCS/$file,v -a $dir/RCS/$file,v \
	-ot $dir/$file -o -f $dir/$file,v -a $dir/$file,v -ot $dir/$file ]
then
        echo "On a trouve un fichier $file,v plus vieux que $file"
	msg="## Warning! $1 est plus récent que le fichier $file,v\
du depot ($USER@`uname -n`:$PWD) \
Sauvegarde : $file.$date"
	logger -s -t rvi -p user.notice $msg
	echo $msg | mail -s "## rvi" -E netadmin@example.com
	cp $file $file.$date
	co -l -f $file
	cp $file.$date $file
	rcsdiff -u $file
	ci -u -m"rvi" $file
	chown $OWNER:$GROUP $FILE && chmod $RIGHTS $FILE
        #exit 1
fi

co -l -f $1
chown $OWNER $1 && chmod $RIGHTS $1
${EDITOR:=vi} $1
rcsdiff -u $1
ci -u -m"rvi" $1
chown $OWNER $1 && chmod $RIGHTS $1

Couplé à sudo(8) et syslog(3), ça permet de savoir qui a fait quelle modification quand et de revenir sur la modification. Bref, indispensable.

Si quelqu'un a malencontreusement oublié d'utiliser le contrôle de version, les modifications ne sont pas perdues pour autant mais intégrées et une erreur est signalée par courrier et via syslog(3).

Sur les systèmes ne disposant pas de fstat(1), voici une version utilisant Perl :

$ cat rvi
#!/bin/ksh
#
# Pascal Cabaud
# Universite Paris Diderot

LANG_LOCAL=`echo $LANG`
export LANG=C

date=`date +%Y%m%d.%H%M%S`

dir=`dirname $1`
file=`basename $1`
if [ ! -d $dir/RCS ]; then
        mkdir -p $dir/RCS
        if [ -f $dir/$file,v -a -d $dir/RCS ]; then
                mv $dir/$file,v $dir/RCS
        fi
fi

if [ -f $dir/RCS/$file,v -a $dir/RCS/$file,v -ot $dir/$file \
	-o -f $dir/$file,v -a $dir/$file,v -ot $dir/$file ]
then
        echo "On a trouve un fichier $file,v plus vieux que $file"
        msg="## Warning! $1 est plus récent que le fichier $file,v du depot ($USER@`uname -n`:$PWD) \
Sauvegarde : $file.$date"
        logger -t rvi -p user.notice $msg
	echo $msg
        echo $msg | mailx -s "## rvi" netadmin@example.com
	cp $file $file.$date
	co -l -f $file
	cp $file.$date $file
	rcsdiff -u $file
	ci -u -m"rvi" $file
	chown $OWNER:$GROUP $FILE && chmod $RIGHTS $FILE
        #exit 1
fi

RIGHTS=`perl -e 'printf "%04o", (stat($ARGV[0]))[2] & 07777' $1`
FILE=`perl -e 'print $ARGV[0]' $1`
GROUP=`perl -e 'printf "%d", (stat($ARGV[0]))[5] ' $FILE`
OWNER=`perl -e 'printf "%d", (stat($ARGV[0]))[4] ' $FILE`
co -l -f $FILE
chown $OWNER:$GROUP $FILE && chmod $RIGHTS $FILE
$EDITOR $FILE
rcsdiff -u $FILE
ci -u -m"rvi" $FILE
chown $OWNER:$GROUP $FILE && chmod $RIGHTS $FILE
export LANG=$LANG_LOCAL
user/pascal_cabaud/sysadmin/rvi.txt · Dernière modification: 2009/04/06 23:06 par Pascal Cabaud