====== Allestire un repository SVN ======
Vedere le guide:
* **[[http://www.howtoforge.com/debian_subversion_websvn|Setting up Subversion and websvn on Debian]]**.
* **[[http://www.reviewingit.com/index.php/content/view/62/2/|Installing Subversion on Debian Etch Complete]]**
* **[[http://svnbook.red-bean.com/index.en.html|Version Control with Subversion]]**
===== Setup una-tantum =====
Installare i pacchetti:
* **subversion**
* **libapache2-svn**
* **enscript**
* **websvn**
Creare la directory e aggiungere un gruppo. In questo semplice esempio tutti gli utenti svn apparterranno al gruppo e potranno accedere a tutti i progetti.
mkdir /var/lib/svn
addgroup subversion
Configurando **WebDAV** (vedere più avanti) per ogni repository sarà possibile puntare il browser su un URL del tipo **''%%http://host/svn/my_project/%%''**. Il controllo di accesso avviene tramite autenticazione HTTP, è possibile anche definire delle ACL sulle directory.
Se si installa **WebSVN** (vedere più avanti) si potrà puntare il browser all'indirizzo **''%%http://host/websvn/%%''** e sfogliare i vari repository. Il controllo di accesso può avvenire con lo stesso file di configurazione usato da WebDAV.
Per utilizzare SVN via web esiste anche [[http://supermind.nl/submin/about.html|Submin]], non pacchettizato Debian.
* FIXME Configurare l'HTTPS.
===== Creazione di un repository =====
Si vuole un repository SVN a cui accedere via **ssh** (richiede utente Unix) e via **http** (richiede autenticazione HTTP).
Per creare un nuovo repository di nome **''my_project''**:
svnadmin create --fs-type fsfs /var/lib/svn/my_project
chgrp -R subversion /var/lib/svn/my_project
chmod -R g+w /var/lib/svn/my_project
chmod -R o-r /var/lib/svn/my_project
chmod -R o-x /var/lib/svn/my_project
find /var/lib/svn/my_project -type d | xargs chmod g+s
I comandi sopra fanno in modo che tutti i file appartengano al gruppo ''subversion'', settare il bit SETGID sulle directory impone che anche i file nuovi apparterranno a tale gruppo. Per accedere al repository SVN sia via **ssh** che via **http** è necessario che l'utente Unix e il demone http appartengano al gruppo:
adduser niccolo subversion
adduser www-data subversion
/etc/init.d/apache2 restart
Per migliorare il debug (ad esempio per vedere gli errori di Permission denied) si edita sul server il file **''/etc/subversion/config''** impostando l'opzione ssh nella sezione ''%%[tunnels]%%'':
[tunnels]
ssh = $SVN_SSH ssh -o ControlMaster=no
Adesso si prova a fare un **''import''** dal proprio PC verso il server:
mkdir trunk
echo "Prova" > trunk/README
svn import -m "Prova di import via ssh+svn" trunk svn+ssh://host/var/svn/my_project/trunk
Proviamo adesso a fare un list e quindi un checkout:
svn list svn+ssh://host/var/svn/my_project/trunk
svn co svn+ssh://host/var/svn/my_project/trunk
Per vedere il contenuto del repository dal server stesso:
svnlook tree /var/svn/my_project/
===== Configurazione accesso WebDAV =====
Consente l'accesso al repository tramite protocollo HTTP, l'autenticazione e l'eventuale controllo di accesso viene eseguito dal server web, quindi non è necessario avere un account Unix sul server.
In un file del tipo **''/etc/apache2/sites-available/svn_dav''** si configura l'accesso WebDAV:
DAV svn
SVNPath /var/lib/svn/my_project
#SVNParentPath /var/lib/svn
AuthType Basic
AuthName "Subversion Repository for my_project"
AuthUserFile /etc/apache2/svndav_my_project.passwd
#AuthUserFile /etc/apache2/svndav.passwd
Require valid-user
#SSLRequireSSL
Ovviamente si deve creare il file delle password con **''htpasswd''** ed eventualmente configurare l'accesso in HTTPS. Per sfogliare il progetto basta puntare il browser su **''%%http://host/svn/my_project%%''**.
Per pubblicare tutti i repository con una sola configurazione si usa la direttiva **''SVNParentPath''** al posto di ''SVNPath'', in tal caso è opportuno dare un nome appropriato alla ''Location'' e alla ''AuthUserFile''.
Il file indicato da AuthUserFile deve appartenere a **''root:www-data''** con **''mode 640''**. Viene gestito con **''htpasswd''**.
Per accedere tramite WebDAV si usa la sintassi:
svn co http://host/svn/my_project/trunk
viene chiesto login e password per l'autenticazione HTTP, non quella ssh.
==== ACL ====
Per definire delle ACL sulle singole directory basta creare un file, ad esempio **''/etc/apache2/svndav_my_project.acl''**:
[groups]
rwgroup = usera, userb
rogroup = userc
[my_project:/]
@rwgroup = rw
@rogroup = r
[my_project:/trunk]
@rwgroup = rw
@rogroup = r
Se il file si riferisce ad un solo repository si può omettere la parte **''my_project:''** nel titolo della sezione. Nel file di configurazione di Apache, nella opportuna ''%%%%'', si aggiunge:
...
AuthzSVNAccessFile /etc/apache2/svndav_my_project.acl
===== Configurazione accesso con WebSVN =====
Consente di sfogliare un repository SVN vedendo le modifiche apportate, scaricando i file, ecc. È possibile impostare un controllo di accesso sulle singole directory.
Il pacchetto Debian installa il file di configurazione **''/etc/apache2/conf.d/websvn''** che pubblica l'alias **''%%http://host/websvn%%''**, la root dei progetti SVN e i progetti pubblicati sono configurati in **''/etc/websvn/svn_deb_conf.inc''**. Utilizzare ''dpkg-reconfigure'' per aggiornare la configurazione.
^ ''%%$config->parentPath()%%'' | Dichiara una directory che contiene uno o più repository. |
^ ''%%$config->addRepository()%%'' | Dichiara una directory di un solo repository. |
Il demone http deve avere accesso al repository (che può essere anche remoto), eventualmente si impostano le credenziali di accesso nello stesso file di configurazione.
Per attivare il controllo di accesso bisogna creare un //Subversion access file//. Si può usare lo stesso file ACL usato per WebDAV. Dovrebbe essere possibile usare lo stesso file ACL anche per il programma Subversion (quindi rendere le ACL valide per ogni metodo di accesso). Per il singolo repository tale file viene indicato in **''conf/svnserve.conf''**, a livello di sistema forse va messo in ''/etc/subversion/config''? FIXME
Nella configurazione di WebSVN si aggiunge (è preferibile editare **''/etc/websvn/config.php''** piuttosto che ''/etc/websvn/svn_deb_conf.inc'', perché non viene riscritto dal gestore pacchetti Debian):
$config->useAuthenticationFile('/etc/apache2/svndav.acl');
È più sensato in questo caso usare un file di autenticazione globale (valido per ogni progetto) e non quello del singolo progetto.
In ogni caso bisogna proteggere l'applicativo con l'autenticazione Apache, ad esempio in **''/etc/apache2/conf.d/websvn''** si aggiunge:
...
AuthType Basic
AuthName "Subversion Repository for my_project"
AuthUserFile /etc/apache2/svndav.passwd
Require valid-user