<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>SvnHowTo</title><revhistory><revision><revnumber>26</revnumber><date>2012-12-12 12:08:24</date><authorinitials>ClauzClauz</authorinitials><revremark>trac con WSGI</revremark></revision><revision><revnumber>25</revnumber><date>2010-10-15 11:17:55</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>24</revnumber><date>2009-09-08 09:51:29</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>23</revnumber><date>2009-09-08 09:45:39</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>22</revnumber><date>2009-02-09 13:54:31</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>21</revnumber><date>2009-02-09 13:42:21</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>20</revnumber><date>2008-11-04 01:10:05</date><authorinitials>OrazioPirataDelloSpazio</authorinitials></revision><revision><revnumber>19</revnumber><date>2008-10-23 10:03:01</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>18</revnumber><date>2008-03-18 17:28:14</date><authorinitials>localhost</authorinitials><revremark>converted to 1.6 markup</revremark></revision><revision><revnumber>17</revnumber><date>2008-01-29 17:34:25</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>16</revnumber><date>2007-12-11 11:40:05</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>15</revnumber><date>2007-11-13 13:34:26</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>14</revnumber><date>2007-05-26 18:22:51</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>13</revnumber><date>2007-05-26 18:08:35</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>12</revnumber><date>2007-05-26 17:44:42</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>11</revnumber><date>2007-05-26 17:38:00</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>10</revnumber><date>2007-05-26 17:29:33</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>9</revnumber><date>2007-05-26 17:20:26</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>8</revnumber><date>2007-05-26 17:16:29</date><authorinitials>ZioPRoTo</authorinitials></revision><revision><revnumber>7</revnumber><date>2007-04-29 13:42:22</date><authorinitials>ClauzClauz</authorinitials></revision><revision><revnumber>6</revnumber><date>2007-04-29 13:40:51</date><authorinitials>ClauzClauz</authorinitials></revision><revision><revnumber>5</revnumber><date>2007-04-29 08:08:50</date><authorinitials>ClauzClauz</authorinitials></revision><revision><revnumber>4</revnumber><date>2007-04-28 19:55:42</date><authorinitials>ClauzClauz</authorinitials></revision><revision><revnumber>3</revnumber><date>2007-04-28 19:54:47</date><authorinitials>ClauzClauz</authorinitials></revision><revision><revnumber>2</revnumber><date>2007-04-28 19:41:15</date><authorinitials>ClauzClauz</authorinitials></revision><revision><revnumber>1</revnumber><date>2007-04-28 18:47:16</date><authorinitials>ClauzClauz</authorinitials></revision></revhistory></articleinfo><section><title>Subversion (SVN) Mini HowTo</title><section><title>Introduzione</title><para><ulink url="http://subversion.tigris.org/">Subversion</ulink> (SVN) si propone di essere il successore di CVS, ovvero un tool (composto da client e server) per lo sviluppo collaborativo. Questo mini howto riguarda sia l'uso con il client (ad un di livello introduttivo) che l'installazione di un server che gestisce repository SVN. Per documentazione piu' completa (installazione, svnserve) ed approfondita rimandiamo alla documentazione ufficiale su <ulink url="http://svnbook.org/"/> .  </para></section><section><title>Utilizzo di client SVN</title><section><title>Trac</title><para><ulink url="http://trac.edgewall.org/">Trac</ulink> permette di visualizzare il contenuto del repository SVN attraverso un'interfaccia web. Per esempio <ulink url="https://svn.ninux.org/ninuxdeveloping"/> . </para></section><section><title>trunk, branches, tags</title><para>Quando si utilizza svn e' usanza avere 3 directory: </para><itemizedlist><listitem><para>trunk - contiene il ramo di sviluppo principale </para></listitem><listitem><para>branches - contiene rami di sviluppo secondari </para></listitem><listitem><para>tags - contiene snapshot delle altre due directory in momenti significativi dello sviluppo </para></listitem></itemizedlist></section><section><title>svn checkout</title><para>Esempio: </para><screen><![CDATA[$svn checkout http://test.ninux.org/svn/pippo/trunk]]></screen><para>oppure (abbreviato)  </para><screen><![CDATA[$svn co http://test.ninux.org/svn/pippo/trunk]]></screen><para>scarica la revisione piu' aggiornata del contenuto della directory remota pippo/trunk nella directory locale corrente. Questo comando in genere va utilizzato una sola volta inizialmente. Possiamo iniziare a sviluppare modificando la copia di lavoro, ovvero i file scaricati. </para></section><section><title>svn status</title><screen><![CDATA[$svn status]]></screen><para>Mostra una lista di file. I flag principali: </para><itemizedlist><listitem><para>M: file modificato </para></listitem><listitem><para>A: file aggiunto </para></listitem><listitem><para>D: file cancellato </para></listitem><listitem><para>?: file non sotto il controllo di subversion (i comandi svn non hanno effetto su quel file) </para></listitem></itemizedlist></section><section><title>svn update</title><para>Aggiorna la copia di lavoro dal repository </para><screen><![CDATA[$svn update]]></screen><para>Mentre svn checkout di solito viene utilizzato una sola volta all'inizio, svn update aggiorna alla revisione piu' recente la copia gia' scaricata con svn checkout. Durante l'update possono comparire alcuni flag: </para><itemizedlist><listitem><para>A - file aggiunto (Added) </para></listitem><listitem><para>U - file aggiornato (Updated) </para></listitem><listitem><para>G - cambiamenti fusi (merGed), quando modifiche locali ed aggiornamento dal repository sono compatibili </para></listitem><listitem><para>C - conflitto (Conflict). Le modifiche locali non sono compatibili con quelle nel repository. Vedere piu' giu' come risolvere conflitti. </para></listitem></itemizedlist></section><section><title>svn commit</title><screen><![CDATA[$svn commit -m "risolto bug n. 12"]]></screen><para>oppure </para><screen><![CDATA[$svn ci -m "risolto bug n. 12"]]></screen><para>Fa l'upload delle modifiche correnti. L'opzione -m e' obbligatoria ed e' buona regola scrivere un messaggio significativo con la descrizione delle nuove modifiche. </para></section><section><title>file: nuovi, copiare, rinominare, spostare</title><para>Quando si crea un nuovo file, questo non viene aggiunto automaticamente al controllo di subversion (ovvero i comandi svn non hanno effetto su quel file). Per aggiungere un file o una directory al controllo di subversion utilizzare svn add: </para><screen><![CDATA[$svn add nuovofile.txt]]></screen><para>Per le directory si puo' utilizzare </para><screen><![CDATA[$svn mkdir nuovadirectory]]></screen><para>che crea la nuova directory &quot;nuovadirectory&quot; e la aggiunge al controllo di subversion.  </para><para>Per cancellare file non bisogna mai utilizzare i comandi del sistema operativo, ma il comando svn delete: </para><screen><![CDATA[$svn delete file.c]]></screen><para>Anche per copiare non bisogna utilizzare il sistema operativo, ma </para><screen><![CDATA[$svn copy file.c ./nuovadir/file.c]]></screen><para>Similmente per rinominare e spostare: </para><screen><![CDATA[$svn move file.c file.cpp]]></screen></section><section><title>svn help</title><screen><![CDATA[$svn help copy]]></screen><para>svn help mostra l'aiuto per un determinato subcomando di subversion (i subcomandi sono checkout, udpate, commit, etc) </para></section><section><title>risolvere conflitti: svn resolved</title><para>Durante l'update puo' capitare che vicino al nome di un file compaia il flag &quot;C&quot;. In questi casi nella directory di lavoro possiamo trovare 4 file, per esempio: </para><itemizedlist><listitem><para>file.c.mine: file.c come era prima di fare l'update </para></listitem><listitem><para>file.c.r75: file.c revisione 75 (quella &quot;nuova&quot; sul repository) </para></listitem><listitem><para>file.c.r73: file.c revisione 73 (quella &quot;vecchia&quot; sulla quale si sono apportate modifiche) </para></listitem><listitem><para>file.c: file.c con dei marker <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code>, <code>---------</code> e <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code> che indicano le parti dove ci sono righe in conflitto </para></listitem></itemizedlist><para>Per risolvere il conflitto potremmo: </para><itemizedlist><listitem><para>sovrascrivere file.c con la nostra versione </para></listitem><listitem><para>sovrascrivere file.c con la revisione 75 </para></listitem><listitem><para>modificare file.c fondendo le modifiche </para></listitem></itemizedlist><para>Finito di risolvere il conflitto diamo il comando </para><screen><![CDATA[$svn resolved file.c]]></screen><para>che elimina i file file.mine, file.r75 e file.r73 e marca il conflitto di file.c come &quot;resolved&quot;. </para><para>Quando avviene un conflitto, comunque, e' buona regola contattare gli altri sviluppatori. </para></section><section><title>esempio di ciclo di lavoro</title><para>da fare </para></section><section><title>svn log</title><screen><![CDATA[$svn log --limit 10]]></screen><para>Mostra gli ultimi 10 messaggi di log (messaggi inseriti con l'opzione -m di svn commit). </para></section><section><title>svn diff</title><screen><![CDATA[svn diff ciao.c]]></screen><para>Mostra le modifiche del file ciao.c rispetto alla versione scaricata dal repository. Le righe aggiunte sono precedute da un &quot;+&quot;, mentre le righe eliminate sono precedute da un &quot;-&quot;. Permette anche di vedere le differenze tra varie revisioni. </para></section><section><title>svn revert</title><screen><![CDATA[$svn revert ciao.c]]></screen><para>usato prima del commit elimina tutte le modifiche locali facendo tornare il file all'ultima revisione scaricata (con svn update o svn checkout) dal repository. </para></section></section><section><title>Server Gentoo per repository SVN</title><para>In questo capitolo viene spiegato come configurare apache per gestire diversi servers SVN e le relative piattaforme Trac </para><section><title>Installare Subversion</title><para>prima di tutto emergere SVN </para><screen><![CDATA[emerge subversion]]></screen><para>poi modificate <code>/etc/conf.d/apache2</code> ed assicuratevi di avere tutte queste cose: </para><screen><![CDATA[APACHE2_OPTS="-D DEFAULT_VHOST -D SVN -D SVN_AUTHZ -D DAV -D DAV_FS -D SSL -D SSL_DEFAULT_VHOST -D PHP5"]]></screen></section><section><title>Aggiungere un repository</title><screen><![CDATA[svnadmin create /var/svn/nuovorepos
]]><![CDATA[
vi /etc/apache2/modules.d/47_mod_dav_svn.conf]]></screen><para>ed aggiungere un nuovo blocco location usando come template questo: </para><screen><![CDATA[<Location /svn/repos>
                DAV svn
                SVNPath /var/svn/repos
                AuthType Basic
                AuthName "Subversion repository"
                AuthUserFile /var/svn/conf/svnusers
                AuthzSVNAccessFile /var/svn/conf/svnpolicy
                Require valid-user
                SSLRequireSSL
</Location>]]></screen><para>Specificare un file per gli utenti e un altro file (opzionale) per le autorizzazioni (policy). </para><para>Tipicamente li dovete fare in <code>/var/svn/nuovorepos/conf/</code> chiamandoli </para><itemizedlist><listitem><para>svnusers </para></listitem><listitem><para>svnpolicy </para></listitem></itemizedlist><section><title>File delle password</title><para>Creare il <emphasis role="strong">nuovo file</emphasis> <code>svnuser</code> con questo comando: </para><screen><![CDATA[htpasswd2 -c /var/svn/newrepos/conf/svnusers newuser]]></screen><para>Se il file già esiste invece dovete fare  </para><screen><![CDATA[htpasswd2 /var/svn/newrepos/conf/svnusers newuser]]></screen><para><emphasis role="strong">Altrimenti l'opzione -c cancellerà tutto il file</emphasis> </para></section><section><title>File delle policy (opzionale)</title><para>Con questi file l'utente si autentica, pero' vorrete dare diverse autorizzazioni agli utenti. allora dovrete modificare il file svnpolicy come segue: </para><screen><![CDATA[[test:/trunk]
saverio = rw
lorenzo  = 
* = r]]></screen><para>Altro esempio di file delle policy con gruppi: </para><screen><![CDATA[[groups]
]]><![CDATA[
special-users = saverio, giuseppe
all-users = saverio, giuseppe, dario, vincent, marco
]]><![CDATA[
[nomerepository:/]
#* =
* =  
@all-users = rw
@special-users = rw
]]><![CDATA[
[perimeter:/CARTELLAPRIVATA]
* = 
@special-users = rw]]></screen><para>Con questo file diamo la possibilità all'utente Saverio di lettura e scrittura, e all'utente lorenzo, di sola lettura. </para><para>Se volete che chiunque sia autenticato sia anche autorizzato a fare tutto, basta commentare la linea presente nel file /etc/apache2/modules.d/47_mod_dav_svn.conf cambiandola da: </para><screen><![CDATA[ AuthzSVNAccessFile /var/svn/conf/svnpolicy]]></screen><para>in </para><screen><![CDATA[# AuthzSVNAccessFile /var/svn/conf/svnpolicy]]></screen><para>Se invece volete permettere la lettura (il checkout) anche a chi non è autenticato allora fate cosi: </para><screen><![CDATA[<Location /svn/rastayaqosa>
                DAV svn
                SVNPath /var/svn/rastayaqosa
                AuthType Basic
                AuthName "Subversion repository"
                AuthUserFile /var/svn/rastayaqosa/conf/svnusers
                #AuthzSVNAccessFile /var/svn/rastayaqosa/conf/authz
                #Require valid-user
]]><![CDATA[
                 <LimitExcept GET PROPFIND OPTIONS REPORT>
                        Require valid-user
                </LimitExcept>
                #SSLRequireSSL
        </Location>]]></screen></section></section><section><title>Installare Trac</title><para>Trac è un tool web based per gestire codice di un progetto che usa SVN. </para><para> Su Gentoo amd64 Trac non è ancora un pacchetto stabile, quindi in <code>/etc/portage/package.keywords</code> </para><screen><![CDATA[www-apps/trac ~amd64]]></screen><para>Se usate una architettura x86 non questo passaggio non è necessario </para><para>Per aggiungere un progetto a trac (o meglio per creare un ambiente trac per un progetto): </para><screen><![CDATA[trac-admin /var/lib/trac/project1/ initenv ]]></screen><para>questo comando crea le pagine iniziali che vediamo dal browser quando entriamo in un nuovo ambiente trac </para><para>possiamo subito testare l'ambiente con il web-server intregrato dentro trac.. ma.. noi vogliamo usare apache che è molto meglio <inlinemediaobject><imageobject><imagedata depth="16" fileref="http://www.nnx.me//moin_static197/ninuxtheme02/img/smile.png" width="16"/></imageobject><textobject><phrase>:)</phrase></textobject></inlinemediaobject> </para><para>Sistemiamo i permessi: </para><screen><![CDATA[chown -Rv  apache /var/lib/trac/project1/]]></screen><para>A questo punto dobbiamo fare in modo che il nostro webserver apache sappia come andare a pescare le cartelle dove abbiamo inizializzato in nostro ambiente trac. </para><para>creare un file con estensione <code>.conf</code> in  </para><screen><![CDATA[/etc/apache2/vhosts.d]]></screen><para>questo file verrà appeso alla configurazione di apache, in questo modo non roviniamo l'http.conf e manteniamo la configurazione di apache più ordinata </para><para>Qui c'è un esempio di file, che possiamo chiamare <code>trac.conf</code>. Il blocco Location dice ad apache che la URI /project1 corrisponde su disco alla cartella /var/lib/trac/project1 che è un trac environment Il blocco scripts alias serve ad identificare il trac.cgi Il blocco <ulink url="http://www.nnx.me/SvnHowTo/LocationMatch#">LocationMatch</ulink> serve per abilitare l'autenticazione con login e password in trac </para><screen><![CDATA[<Location /project1> 
                SetEnv TRAC_ENV "/var/lib/trac/project1"
                SetEnv LC_TIME "it_IT"
                Allow from All
</Location>
]]><![CDATA[
ScriptAlias /project1 /usr/share/webapps/trac/0.10.1/hostroot/cgi-bin/trac.cgi
]]><![CDATA[
#<LocationMatch "/[^/]+/login">
<LocationMatch "/project1/login">
 AuthType Basic
  AuthName "Project 1 Trac"
  AuthUserFile /var/svn/conf/svnusers
  Require valid-user
</LocationMatch>]]></screen><para>Riavviare apache2 con <code>/etc/init.d/apache2 restart</code> </para><section><title>Usare WSGI</title><para>WSGI ha performance molto migliori sia del cgi che dell'fcgi. Per usarlo bisogna creare un file trac.wsgi eseguibile e con il seguente contenuto: </para><screen><![CDATA[import sys
sys.stdout = sys.stderr
]]><![CDATA[
import os
os.environ['PYTHON_EGG_CACHE'] = '/var/lib/trac/egg-cache'
]]><![CDATA[
import trac.web.main
application = trac.web.main.dispatch_request]]></screen><para>Ed inserirlo nella directory dei cgi del trac (/usr/share/webapps/trac/0.12.2/hostroot/cgi-bin/).  Configurazione di apache (analoga a quella sopra): </para><screen><![CDATA[<Location /project1> 
                SetEnv TRAC_ENV "/var/lib/trac/project1"
                SetEnv trac.env_path "/var/lib/trac/project1"
                SetEnv LC_TIME "it_IT"
                Allow from All
</Location>
]]><![CDATA[
WSGIScriptAlias /project1 /usr/share/webapps/trac/0.12.2/hostroot/cgi-bin/trac.wsgi
]]><![CDATA[
<LocationMatch "/project1/login">
 AuthType Basic
  AuthName "Project 1 Trac"
  AuthUserFile /var/svn/conf/svnusers
  Require valid-user
</LocationMatch>]]></screen></section></section><section><title>Configurare Trac</title><para>Apriamo il file </para><para><code> /var/lib/trac/project1/conf/trac.ini </code> </para><para>e modifichiamo quello che serve per l'smtp, altrimenti Trac non sarà in grado di spedire l'email di conferma ad i nuovi utenti che si registrano </para></section><section><title>Trac webadmin - gestione utenti facile</title><para>Per customizzare ancora l'interfaccia trac ed attivare la gestione utenti del progetto dal web </para><para>Da Trac 0.11 il pacchetto trac-wedadmin è stato assorbito nel core di Trac quindi non c'è più bisogno di installarlo. </para><para>Andiamo direttamente a modificare il file: </para><para><code> /var/lib/trac/project1/conf/trac.ini </code> </para><para>oltre a modificare a piacere seguendo l'intuitivo template, aggiungiamo alla fine questo blocco (si da per scontato che il plug in di trac è gia installato con emerge la passo prima) </para><screen><![CDATA[[components]
webadmin.* = enabled]]></screen><para>Andate a vedere sul web del vostro trac </para><para>Ora dobbiamo installare l'account manager plugin. Controllate qui: <ulink url="http://trac-hacks.org/wiki/AccountManagerPlugin"/> le istruzioni di installazione, a me è bastato fare cosi: </para><screen><![CDATA[easy_install http://trac-hacks.org/svn/accountmanagerplugin/0.10]]></screen></section><section><title>Trac Permission - Gestione policy SVN da web</title><para>Installate questo plugin <ulink url="http://trac-hacks.org/wiki/TracSvnAuthzPlugin"/> per modificare il file delle policy direttamente da web </para><screen><![CDATA[easy_install http://trac-hacks.org/svn/accountmanagerplugin/0.11]]></screen><para>Poi nella sezione 'admin' del Trac, nel menu 'Plugins' trovate questa nuova feature installata e la potete attivare. </para><section><title>Permessi</title><para>Ho preparato uno script per modificare velocemente i permessi di trac. Modificate il path della variabile URL ed eseguite questo script: </para><screen><![CDATA[URL=/var/lib/trac/project1/
echo $URL
]]><![CDATA[
trac-admin $URL permission remove anonymous BROWSER_VIEW CHANGESET_VIEW CONFIG_VIEW FILE_VIEW LOG_VIEW MILESTONE_ADMIN MILESTONE_CREATE MILESTONE_DELETE MILESTONE_MODIFY MILESTONE_VIEW REPORT_ADMIN REPORT_CREATE REPORT_DELETE REPORT_MODIFY REPORT_SQL_VIEW REPORT_VIEW ROADMAP_ADMIN ROADMAP_VIEW SEARCH_VIEW TICKET_ADMIN TICKET_APPEND TICKET_CHGPROP TICKET_CREATE TICKET_MODIFY TICKET_VIEW TIMELINE_VIEW TRAC_ADMIN WIKI_ADMIN WIKI_CREATE WIKI_DELETE WIKI_MODIFY WIKI_VIEW
]]><![CDATA[
]]><![CDATA[
trac-admin $URL permission add authenticated BROWSER_VIEW CHANGESET_VIEW CONFIG_VIEW FILE_VIEW LOG_VIEW MILESTONE_ADMIN MILESTONE_CREATE MILESTONE_DELETE MILESTONE_MODIFY MILESTONE_VIEW REPORT_ADMIN REPORT_CREATE REPORT_DELETE REPORT_MODIFY REPORT_SQL_VIEW REPORT_VIEW ROADMAP_ADMIN ROADMAP_VIEW SEARCH_VIEW TICKET_ADMIN TICKET_APPEND TICKET_CHGPROP TICKET_CREATE TICKET_MODIFY TICKET_VIEW TIMELINE_VIEW TRAC_ADMIN WIKI_ADMIN WIKI_CREATE WIKI_DELETE WIKI_MODIFY WIKI_VIEW
]]><![CDATA[
trac-admin $URL permission add anonymous WIKI_VIEW]]></screen><para>fatto questo diamo un aggiustatina ai permessi, cosi trac può operare sui files del repository: </para><screen><![CDATA[cd /var/svn
chgrp -Rv apache project1/
chmod -Rv 775 project1/]]></screen><para>ora possiamo editare quasi tutte le opzioni di trac dal web, ovviamente solo se siamo loggati! </para><para>se qualcosa non funziona subito riavviate apache! </para><para>More info here: <ulink url="http://www.gentoo-wiki.com/HOWTO_Trac"/> </para></section></section><section><title>Note finali da riorganizzare</title><screen><![CDATA[cd /etc/apache2/ssl
openssl genrsa -out svn.ninux.org.key 2048
openssl req -new -key svn.ninux.org.key -out svn.ninux.org.csr
openssl x509 -req -days 1000 -in svn.ninux.org.csr -signkey svn.ninux.org.key -out svn.ninux.org.crt
chmod 400 *]]></screen></section></section></section></article>