# [howto] subversion

## bouleetbil

J'ai eu du mal à configurer subversion donc voici un début de howto pour ceux que cela intérresse.

Définition :

C'est un serveur qui centralise tous les fichiers à partager entre les membres d'un groupe et gère les modifications simultanées des fichiers, tout en gardant un historique de chaque version d'un fichier. Cela permet d'éviter les erreurs, par exemple si quelqu'un fait une mauvaise modification dans un fichier, il est très facile de revenir en arrière puisque chaque version d'un fichier se trouve sur le serveur.

Le plus connu des serveurs de source est CVS. Il est très utilisé sur le Web, mais Subversion gagne de plus en plus d’importance et ne va pas tarder à le remplacer. Subversion peut être considéré comme CVS 2 car les développeurs de CVS ont participé son développement. Le but était de garder tous les points forts de CVS tout en corrigeant tous ses défauts.

Le site officiel de Subversion est :

http://subversion.tigris.org/

Livre O'reilly sur subversion téléchargeable gratuitement mais en anglais

http://svnbook.red-bean.com/

1. Installation

Liste des use disponible : apache2 bash-completion berkdb emacs java minimal nls nowebdav perl python zlib 

```
# echo "dev-util/subversion berkdb apache2" >> /etc/portage/package.use

# emerge subversion
```

Pour lancer la configuration automatique :

```
# ebuild /var/db/pkg/dev-util/subversion-1.*/subversion-1.*.ebuild config
```

2. Création du projet en local

Lors de l’évolution d’un programme, il se peut que les développeurs travaillent sur plusieurs versions en même temps.

Prenons pour exemple des développeurs qui viennent de sortir la version 1 d’un logiciel.

Les développeurs travaillent sur la version 2 qui implique des changements majeurs dans la structure du programme. Mais en même temps ils doivent sortir une version 1.1 qui corrigera des bogues de la version 1. Les versions 2 et 1.1 du logiciel sont incompatibles, c’est pourquoi il n’est pas possible de stocker tous les fichiers dans un même répertoire (trunk). Pour que les développeurs puissent travailleur sur les 2 versions en même temps, ils vont copier tous les fichiers du projet dans un nouveau répertoire. Ce nouveau répertoire contiendra la copie exacte des fichiers du projet, mais permettra de faire des modifications qui n’impacteront pas. Ce nouveau répertoire est une branche du projet.

La branche principale de travail est appelée "trunk", les autres branches ont pour répertoire racine "branches" dans la convention Subverion.

Le répertoire « trunk » du repository contient toujours la version qui sera amenée à évoluer le plus longtemps. Dans notre cas c’est la version 2 du projet.

Le répertoire « branches » du repository contient autant de répertoire qu’il y a des branches dans le projet.

Dans notre exemple, on a ici le répertoire trunk qui contient les fichiers de la version 2 du logiciel. Le répertoire branches contient un répertoire qui s’appelle « version1.x » et qui contient tous les fichiers de la version 1.1.

Pour résumer, créer une branche, c’est exactement comme si on avait 2 projets différents avec 2 repository différents. Le seul avantage est de regrouper toutes les branches dans un même repository.

Tags

Le concept de tag est de prendre une photo du repository à un moment donnée. Par exemple lors de la sortie d’un programme (version 1.0), il est intéressant de savoir quel numéro de révision correspond à telle version. Pour cela on peut tagger le repository afin de se souvenir plus simplement.

Un tag est une copie du repository à un moment donnée. Cela revient à copier dans un répertoire à part tous les fichiers du repository.

Un exemple de structure d’un repository. Cette architecture est conseillée par Subversion.

A la racine il y a 3 répertoires:

    * trunk pour les fichiers de la version principale du projet

    * branches pour les différents branches

    * tags pour la sauvegarde de chaque version du projet

Seul le chef de projet a accès à la branche tags, car c’est lui qui décide quand les versions sortent.

Création du projet :

```

# mkdir projet

# mkdir projet/branches

# mkdir projet/tags

# mkdir projet/trunks

```

3. configuration du projet en local :

Mettre les droits approprie pour /var/svn/repos en fonction des utilisateurs ayant accés aux sources

Import du projet :

```

$ svn import /home/bouleetbil/Project file:///var/svn/repos/ -m "initial import"

```

A partir de maintenant, il est possible d'accéder au dossier des sources, pour un réseau local il est possible d'utiliser nfs ou samba pour le partage.

Pour récuperer le contenu du dépot :

```

$ svn checkout file:///var/svn/repos test1

```

4. Configuration client Serveur 

Il peut être utile de partager ces sources sur le réseau  :Wink: 

/var/svn/repos/conf/svnserve.conf contient la configuration du démon svn, décommenter les lignes suivantes : 

```
anon-access = read # tous le monde peut lire

auth-access = write # Seul les personnes identifiées peuvent écrirent

password-db = passwd # passwd contient les utilisateurs et les mots de passe
```

Exemple de fichier /var/svn/repos/conf/password-db

```
[users]

harry = foopassword # harry a pour mot de passe foopassword

sally = barpassword # sally a pour mot de passe barpassword
```

Le fichier de configuration du démon svn est /etc/conf.d/svnserve :

```

# The commented variables in this file are the defaults that are used

# in the init-script.  You don't need to uncomment them except to

# customize them to different values.

# Options for svnserve

#SVNSERVE_OPTS="--root=/var/svn"

# User and group as which to run svnserve

#SVNSERVE_USER="apache"

#SVNSERVE_GROUP="apache"

```

Pour une question de sécurité il est possible de passer "-r" en argument à svnserve. Cela reduit l'exportation au répertoire passé après -r

```
$ svnserve -d -r /var/svn/repos
```

Configuration svn avec xinetd :

```

service svnserve

{

        disable         = no

        socket_type     = stream

        wait            = no

        user            = root

        group           = root

        log_type        = FILE /var/log/svnserve

        protocol        = tcp

        log_on_failure += USERID

        port            = 3690

        server          = /usr/bin/svnserve

        server_args     = -i -r /var/svn/repos

}

```

Pour démarrer le serveur svn 

Soit en mode autonome :

```
# /etc/init.d/svnserve start
```

Soit avec xinetd

```
# /etc/init.d/xinetd start
```

Il est possible d'acceder au dépot via SSH si vous avez un serveur SSH actif :

```

$ svn list svn+ssh://frogdev.dyndns.org/repos

```

Utilisation du module subversion avec Apache2

Editer /etc/conf.d/apache2 afin d'ajouter ces options :

```

 APACHE2_OPTS="-D DEFAULT_VHOST -D SVN -D SVN_AUTHZ -D DAV -D DAV_FS -D SSL -D SSL_DEFAULT_VHOST"

```

Apache doit avoir le droit d'écrire dans le répertoire du projet :

```

# chown apache:apache /var/svn/repos/projet -R

```

Le fichier de configuration du module est ici /etc/apache2/modules.d/47_mod_dav_svn.conf

```

  GNU nano 1.3.9  Fichier : /etc/apache2/modules.d/47_mod_dav_svn.conf 

<IfDefine SVN>

        <IfModule !mod_dav_svn.c>

                LoadModule dav_svn_module       modules/mod_dav_svn.so

        </IfModule>

        <Location /svn/repos>

                DAV svn

                SVNPath /var/svn/repos

                AuthType Basic

                AuthName "Subversion repository"

                AuthUserFile /var/svn/repos/conf/passhttp

                Require valid-user

        </Location>

        <IfDefine SVN_AUTHZ>

                <IfModule !mod_authz_svn.c>

                        LoadModule authz_svn_module     modules/mod_authz_svn.so                </IfModule>

        </IfDefine>

</IfDefine>

```

Pour une authentification HTTP basic 

```
# htpasswd2 -cm /var/svn/repos/conf/passhttp harry
```

Attention le paramètre c  créer le fichier, il ne faut mettre ce paramètre que lors de la création du premier utilisateur. 

Redémarrer apache :

```

# /etc/init.d/apache2 restart

```

Maintenant le dépot est accessible :

```

$ svn checkout http://frogdev.dyndns.org/svn/repos test1

```

Maintenant si vous voulez que votre dépot soit accéssible en lecture pour tous le monde :

Remplacer dans /etc/apache2/modules.d/47_mod_dav_svn.conf

```

Require valid-user

```

par

```

<LimitExcept GET PROPFIND OPTIONS REPORT>

Require valid-user

</LimitExcept>

```

Maintenant, il est aussi possible de définir des règles.

Voici une autre configuration possible :

```
<IfDefine SVN>

        <IfModule !mod_dav_svn.c>

                LoadModule dav_svn_module       modules/mod_dav_svn.so

        </IfModule>

        <Location /svn/repos>

                DAV svn

                SVNPath /var/svn/repos

                AuthName "Subversion repository"

                AuthUserFile /var/svn/repos/conf/passhttp

                #On tente d’abord un accès anonyme, si ce n’est pas possible on authentifie

      Satisfy Any

      Require valid-user

      AuthzSVNAccessFile /var/svn/repos/conf/PolitiqueSecu

      #Comment authentifier un utilisateur

      AuthType Basic

        </Location>

        <IfDefine SVN_AUTHZ>

                <IfModule !mod_authz_svn.c>

                        LoadModule authz_svn_module     modules/mod_authz_svn.so                </IfModule>

        </IfDefine>

</IfDefine>
```

Le fichier /var/svn/repos/conf/PolitiqueSecu contient les règles. 

Voici la stucture de ce fichier :

```

[groups]

Nom_du_groupe = utilisateur1, utilisateur2, …

[Nom_du_repo : Path]

compte ou groupe = *, r, w

```

La première déclaration permet de définir des groupes d’utilisateurs. Ceci va permettre d’appliquer des droits directement sur un groupe.

Ensuite on déclare pour le répertoire d’un repository, les droits des utilisateurs.

Voici un exemple de configuration :

```

[groups]

developpeur = harry, billy

[/]

*=r 

admin=rw

[Projet1:/]

* = r

developpeur=rw

[Projet2:/]

*=

developpeur=r

[Projet2:/branches/harry]

harry=rw

```

Attention tous les utilisateurs doivent être créé aussi par htpasswd2 dans /var/svn/repos/conf/passhttp

----------

## PabOu

 *bouleetbil wrote:*   

> Pour lancer la configuration automatique :
> 
> ```
> # ebuild /var/db/pkg/dev-util/subversion-1.*/subversion-1.*.ebuild config
> ```
> ...

 

il n'y a pas une façon plus propre de le faire ?

parceque n'oubliez pas que lancer un ebuild avec son chemin est une "broken feature".

je confonds peut-etre.

en tout cas, joli how-to, bravo et merci !

----------

## bouleetbil

Bonsoir,

Je crois que c'est lancer l'installation avec le chemin de l'ebuild qui est "broken feature"

La en faite c'est pour lancer une fonction inclue dans l'ebuild :

```

if [[ ! -x /usr/bin/svnadmin ]]; then

                die "You seem to only have build the subversion client"

        fi

        einfo ">>> Initializing the database in ${SVN_REPOS_LOC}..."

        if [[ -e ${SVN_REPOS_LOC}/repos ]]; then

                echo "A subversion repository already exists and I will not overwrite it."

                echo "Delete ${SVN_REPOS_LOC}/repos first if you're sure you want to have a clean version."

        else

                mkdir -p ${SVN_REPOS_LOC}/conf

                einfo ">>> Populating repository directory ..."

                # create initial repository

                /usr/bin/svnadmin create ${SVN_REPOS_LOC}/repos

                einfo ">>> Setting repository permissions ..."

                chown -Rf apache:apache ${SVN_REPOS_LOC}/repos

                chmod -Rf 755 ${SVN_REPOS_LOC}/repos

        fi

```

sinon il faut faire :

```
# mkdir -p /var/svn/conf

# /usr/bin/svnadmin create /var/svn/repos

# chown -Rf apache:apache /var/svn/repos

# chmod -Rf 755 /var/svn/repos
```

----------

## netfab

Ou plus simplement :

```

# emerge --config subversion

```

J'ai eu du mal aussi à m'y mettre. La première fois que je l'ai installé, j'ai choisi la première solution :

 *Quote:*   

> 
> 
> - svnserve daemon:
> 
>  *    1. edit /etc/conf.d/svnserve
> ...

 

Après avoir modifié les droits de /var/svn/repos pour apache:apache, rempli les différents fichiers de configuration, et redémarré les serveurs, çà fonctionnait.

Mais çà ne me paraissait pas clair, j'ai donc tout désinstallé, et recommencé. Et là, plus moyen de faire l'import initial : la commande svn import me renvoyait systématiquement un message d'erreur comme quoi je n'avais pas les droits sur certains dossiers.

J'ai finalement effectué les commandes pour l'accès par ssh :

 *Quote:*   

> 
> 
> - svn over ssh:
> 
>  *    1. Fix the repository permissions:
> ...

 

Puis, un petit /etc/init.d/svnserve start, et çà fonctionnait du premier coup.

----------

## kwenspc

eh bien, j'allais justement avoir besoin de me mettre à svn  :Smile: 

Ce howto est le bienvenu donc! merci

----------

## marvin rouge

Y'a un bout de temps que j'ai installé subversion, et à l'époque j'avais configuré un utilisateur de manière à ce qu'une connexion ssh le redirige automatiquement sur svn: en gros, l'utilisateur tape sa commande svn (par exemple svn log), et ça le connecte au serveur en ssh via une clé sans passphrase, ça effectue la commande et ça le déconnecte.

Pour ça, faut faire un fichier /etc/ssh/authorized_users (à configurer dans sshd_config par AuthorizedKeysFile  /etc/ssh/authorized_users) avec dedans:

```
command="/usr/local/bin/svnserve -t --tunnel-user=USER -r /var/svn/web_repos" ssh-dss la_clé_publique
```

(remplacer USER par le nom de l'utilisateur, et la_clé_publique aussi).

Dans ~/.ssh/config de USER je configure un alias "externe"

Le premier checkout se fait avec svn checkout svn+ssh://externe/

Ensuite, plus besoin de svn+ssh://, juste svn.

----------

## netfab

Petit complément : Installation Trac

Introduction

Installation trac

Configuration Apache -- Virtual Host

Résolution de nom

The end

1. Introduction :

Petite description de trac :

 *http://linuxfr.org/2004/04/21/16054.html wrote:*   

> 
> 
> Trac est un logiciel libre, sous licence GPL, combinant un Wiki, un navigateur de dépôt Subversion et un outil de suivi des bogues.
> 
> 

 

J'ai pour objectif de configurer apache de façon à pouvoir accéder avec mon navigateur aux différents projets par trac de la manière suivante :

 *Quote:*   

> 
> 
> http://dev.monreseau.net/projet1/
> 
> http://dev.monreseau.net/projet2/
> ...

 

Sachant que :

 *Quote:*   

> 
> 
> $ dnsdomainname
> 
> monreseau.net
> ...

 

Mes dépôts sont stockés dans le répertoire /data/svn-repos :

 *Quote:*   

> 
> 
> $ ls /data/svn-repos/
> 
> projet1 projet2
> ...

 

Par la suite, il faudra donc adapter le fichier de configuration pour apache avec vos propres valeurs.

2. Installation trac :

Les useflags :

 *Quote:*   

> 
> 
> $ grep trac /etc/portage/package.use
> 
> www-apps/trac cgi silvercity sqlite vhosts
> ...

 

```

   # emerge trac

```

Installation de trac sur l'hôte virtuel dev :

```

   # webapp-config -I -h dev -d trac trac 0.9.3

```

(Le répertoire /var/www/dev est apparu)

Création de l'environnement trac pour le projet 1 :

(on répond aux questions, en donnant le répertoire de dépôt du projet 1)

```

   # trac-admin /var/lib/trac/projet1 initenv

```

Création de l'environnement trac pour le projet 2 :

(on répond aux questions, en donnant le répertoire de dépôt du projet 2)

```

   # trac-admin /var/lib/trac/projet2 initenv

```

(les répertoires /var/lib/trac/projet1 et /var/lib/trac/projet2 sont apparus)

On modifie le propriétaire de la base de données trac pour chaque projet :

```

   # chown -R apache:apache /var/lib/trac/projet1/db

   # chown -R apache:apache /var/lib/trac/projet2/db

```

Création utilisateur et mot de passe pour l'authentification trac :

```

   # htpasswd2 -m -c /data/svn-repos/projet1/conf/passwd netfab

   # htpasswd2 -m -c /data/svn-repos/projet2/conf/passwd netfab

```

Vous pouvez certainement utiliser le même fichier que pour l'authentification http.

3. Configuration Apache -- Virtual Host

On créé le fichier /etc/apache2/vhosts.d/01_dev_vhost.conf contenant :

```

<VirtualHost *:80>

    # administrateur serveur

    ServerAdmin root@machine1.monreseau.net

    # Repertoire racine

    DocumentRoot /var/www/dev/htdocs

    ServerName dev.monreseau.net

    ServerAlias dev

    # les fichiers de logs : chemins relatifs à /usr/lib/apache2/

    ErrorLog logs/dev-error_log

    CustomLog logs/dev-access_log common

    # lorsqu'on demande l'url http://dev.monreseau.net/projet1

    ScriptAlias /projet1 /var/www/dev/cgi-bin/trac.cgi

    <Location /projet1>

      # environnement trac projet 1

      SetEnv TRAC_ENV "/var/lib/trac/projet1"

    </Location>

    # lorsqu'on demande l'url http://dev.monreseau.net/projet1/login

    # (demande de login sous trac)

    <Location /projet1/login>

      AuthType Basic

      AuthName "Developpement sous Trac - projet1"

      AuthUserFile /data/svn-repos/projet1/conf/passwd

      Require valid-user

    </Location>

    # lorsqu'on demande l'url http://dev.monreseau.net/projet2

    ScriptAlias /projet2 /var/www/dev/cgi-bin/trac.cgi

    <Location /projet2>

      # environnement trac projet 2

      SetEnv TRAC_ENV "/var/lib/trac/projet2"

    </Location>

    # lorsqu'on demande l'url http://dev.monreseau.net/projet2/login

    # (demande de login sous trac)

    <Location /projet2/login>

      AuthType Basic

      AuthName "Developpement sous Trac - projet2"

      AuthUserFile /data/svn-repos/projet2/conf/passwd

      Require valid-user

    </Location>

    <Directory "/var/www/dev/htdocs">

      Options Indexes MultiViews

      AllowOverride All

      Order allow,deny

      Allow from all

    </Directory>

</VirtualHost>

```

4. Résolution de nom :

J'utilise sur ce serveur un cache DNS (dnsmasq), donc en ce qui me concerne, j'ai juste à ajouter ce qui est en gras dans le fichier de configuration de dnsmasq :

 */etc/dnsmasq.conf wrote:*   

> 
> 
> address=/dev.monreseau.net/192.168.2.78
> 
> address=/machine1.monreseau.net/192.168.2.78
> ...

 

Si vous n'utilisez pas de cache DNS, ajoutez ce nom dans votre /etc/hosts de façon à ce qu'il pointe vers l'adresse ip de votre serveur apache.

5. The end :

On lance apache :

```

   # /etc/init.d/apache2 start

```

Pour avoir accès aux tracs, il suffit de pointer son fureteur sur :

http://dev.monreseau.net/projet1/ ou http://dev.monreseau.net/projet2/

Ou encore :

http://dev/projet1/ ou http://dev/projet2/

En ajoutant la page index.html suivante dans /var/www/dev/htdocs/, on peut même passer par :

http://dev/ ou http://dev.monreseau.net/

 */var/www/dev/htdocs/index.html wrote:*   

> 
> 
> <html>
> 
> <head>
> ...

 

Pour les puristes, il manque le doctype, et énormément d'autres choses.

Je vous laisse peaufiner  :Wink: 

----------

## bouleetbil

Merci

Ce soir je crois que je vais essayer trac   :Laughing: 

----------

## ade05fr

hello

moi quand je configure subversion avec apache je n'arrive pas à faire fonctionner le tout.

je tente d'accéder à ma page contenant le repository en faisant http://localhost/repository

j'ai regardé dans mon error-log d'apache et j'ai des lignes du genre 

...driver for [DBDriver unset] not available..

-- et surtout à la fin de la log j'ai un segmentation fault

[notice] child pid 8923 exit signal segmentation fault (11)

...

voici ce que j'ai dans httpd.conf :

...

LoadModule dav_module  modules/mod_dav.so

LoadModule dav_svn_module  modules/mod_dav_svn.so

LoadModule authz_svn_module  modules/mod_authz_svn.so

...

<Directory "var/svn/repository">

Allow from all

</Directory>

voici ce que j'ai dans le ficheir /etc/conf.d/apache2:

...

APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D SSL -D SSL_DEFAULT_VHOST -D SVN -D SVN_AUTHZ -D DAV -D DAV_FS"

voici ce que j'ai dans /etc/apache2/conf/modules.d/47_mod_dav_svn.conf

<IfDefine SVN>

<IfModule !mod_dav_svn.c>

LoadModule dav_svn_module modules/mod_dav_svn.so

</IfModule>

<Location /repository>

DAV svn

SVNPath /var/svn/repository 

AuthType Basic

AuthName "Subversion repository"

AuthUserFile /var/svn/repository/conf/passhttp

Require valid-user

</Location>

<IfDefine SVN_AUTHZ>

<IfModule !mod_dav_svn.c>

LoadModule authz_svn_module modules/mod_authz_svn.so

</IfModule>

</IfDefine>

</IfDefine>

j'ai aussi fais un "chown -R apache:apache /var/svn/repository"

est ce que quelqu'un peut m'aider ? je ne comprends rien !!

merci d'avance

----------

## bouleetbil

salut,

d'apres ce que j'ai lu la

http://www.nabble.com/DBD%3A-driver-tf2100248.html

et

http://comments.gmane.org/gmane.comp.apache.apr.devel/11114

et la

http://www.nabble.com/DBD%3A-driver-tf2088429.html#a5760878

le module subversion ne trouve pas de base données 

peut-être essayer 

```

# USE="berkdb" emerge -av dev-libs/apr-util 

# USE="apache2 berkdb" emerge -av subversion

# revdep-rebuild

```

----------

