Amaury.net
Accueil Liste articles Forum Ma liste de cadeaux Contact

Dédibox (3) : Subversion et WebDAV

30 avril 2007

Subversion

Pour faire du "versionning" de code source, j'utilisais auparavant CVS. Mais maintenant j'ai bien envie d'essayer Subversion, qui combine la facilité d'utilisation de CVS avec de nouvelles fonctionnalités bien pratiques.

$ sudo apt-get install subversion libapache2-svn
$ a2enmod dav_svn
$ mkdir /var/svn
$ svnadmin create /var/svn/projet
$ chown -R www-data:www-data /var/svn
$ vi /etc/apache2/mods-enabled/dav_svn.conf
$ htpasswd2 -c /etc/apache2/dav_svn.passwd login

Dans un fichier de configuration de site Apache, on fait ce qu'il faut pour que SVN soit accessible par WebDAV :

<Location>
    DAV svn
    SVNPath /var/svn/projet
    AuthType Basic
    AuthName "SVN Repository"
    AuthUserFile /etc/apache2/dav_svn.passwd
    Require valid-user
</Location>
$ apache2ctl restart

Par défaut, SVN ne permet pas d'utiliser le mot-clé $Id$. Pour le permettre, il faut modifier le fichier /etc/subversion/config :

[miscellany]
enable-auto-props = yes
[auto-props]
*.php = svn:keywords=Id

Ici, je l'ai autorisé pour les fichiers PHP uniquement.

Ensuite, on peut utiliser le système de hooks de Subversion, pour lui faire réaliser automatiquement des actions lorsque certaines opérations sont exécutées.
Par exemple, j'ai trouvé sur un blog un hook pre-commit pour empêcher de commiter sur un tag :

REPOS="$1"
TXN="$2"
# Check for modification of tags.
# Reject tag modifications except creation and deletion
SVNLOOK=/usr/bin/svnlook
echo "=============== changed ================" >> /tmp/pre-commit.log
$SVNLOOK changed -t "$TXN" "$REPOS" >> /tmp/pre-commit.log
$SVNLOOK changed -t "$TXN" "$REPOS" | grep "tags/" > /dev/null
if [ $? -eq 0 ] ; then
    $SVNLOOK changed -t "$TXN" "$REPOS" | egrep "^[AD][[:space:]]+(.*/)?tags/[^/]+/$" >/dev/null
    if [ $? -ne 0 ] ; then
        echo >&2 "Les tags ne sont pas modifiables"
        exit 1
    fi
fi
#
# Make sure that the log message contains some text.
$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null
if [ $? -ne 0 ] ; then
    echo >&2 "Pas de commentaires, pas de commit"
    exit 1
fi
exit 0

Sur un autre blog, j'ai trouvé un hook post-commit, qui envoie un email à chaque commit :

#!/bin/sh
REPOS="$1"
REV="$2"
AUTHOR=`svnlook author --revision $REV $REPOS`
SENDER="somebody@somewhere.org"
RECIPIENT="quelqun@quelquepart.org"
SUBJECT=`echo -n "[SVN commit] R-$REV ($AUTHOR) Log: "; \
    svnlook log --revision $REV $REPOS | head -n1`
MESSAGE=`\
    echo "REPOS:  $REPOS"; \
    echo "REV:    [$REV]"; \
    echo "AUTHOR: ($AUTHOR)"; \
    echo; \
    echo "LOG:"; \
    echo "----"; \
    svnlook log --revision $REV $REPOS; \
    echo; \
    echo "FILES:"; \
    echo "------"; \
    svnlook changed --revision $REV $REPOS`
/usr/local/bin/sendEmail -f $SENDER -t $RECIPIENT -u "$SUBJECT" -m "$MESSAGE" > /dev/null

(attention, ce hook utilise le script sendEmail.pl)

WebDAV

Maintenant que j'ai installé un serveur Subversion (SVN) sur le serveur, avec accès par WebDAV, je peux maintenant configurer un accès WebDAV plus classique, juste pour faire du partage de fichiers.

Dans la configuration Apache, je rajoute un VirtualHost qui est dédié à cela :

<VirtualHost>
    ServerAdmin amaury@amaury.net
    ServerName files.amaury.net
    DocumentRoot /home/http/amaury.net/files
    DavLockDB /tmp/data.files.lock
    Alias /icons /usr/share/apache2/icons
    <Directory>
        Options FollowSymLinks +ExecCGI
        AllowOverride All
        DAV On
        DAVMinTimeout 600
        DAVDepthInfinity On
        AllowOverride AuthConfig
        AuthName "Acces WebDAV restreint"
        AuthType Basic
        AuthUserFile /home/http/amaury.net/htpasswd
        <Limit>
            Require valid-user
            Options Indexes FollowSymLinks
        </Limit>
    </Directory>
    LogLevel warn
    ErrorLog /var/log/apache2/files.amaury.net-error.log
    CustomLog /var/log/apache2/files.amaury.net-access.log combined
</VirtualHost>

Il faut évidemment penser à créer un fichier /home/http/amaury.net/htpasswd en utilisant la commande htpasswd2.

Si l'utilisation de fichiers htpasswd est gênante, il est possible d'utiliser le module Apache mod_auth_mysql, qui sert à authentifier les utilisateurs grâce à une base de données MySQL. Cf. cette documentation.

 
Lien super intéressant ;-)