hgbook

changeset 797:26b05b7dd445

Minor changes and translation of code snippets for Ch.10.
author Giulio@puck
date Thu Aug 13 18:57:50 2009 +0200 (2009-08-13)
parents a983cf614c9d
children 7f684caba2d0
files it/ch10-hook.xml it/examples/auto-snippets.xml it/examples/ch09-check_whitespace.py.lst.it it/examples/ch09-hook.ws.better.it it/examples/ch09-hook.ws.simple.it it/examples/ch10-bugzilla-config.lst.it it/examples/ch10-notify-config-mail.lst.it it/examples/ch10-notify-config.lst.it it/examples/hook.msglen.go.it it/examples/hook.simple.ext.it it/examples/hook.simple.init.it it/examples/hook.simple.pretxncommit.it
line diff
     1.1 --- a/it/ch10-hook.xml	Thu Aug 13 14:23:29 2009 +0200
     1.2 +++ b/it/ch10-hook.xml	Thu Aug 13 18:57:50 2009 +0200
     1.3 @@ -56,7 +56,7 @@
     1.4        <para id="x_1f9">Se state lavorando con un repository posseduto da un altro utente, Mercurial può eseguire gli hook definiti nel repository di quell'utente, ma li eseguirà ancora sotto la <quote>vostra identità</quote>. Per esempio, se estraete i cambiamenti da quel repository tramite <command role="hg-cmd">hg pull</command>, e il suo file <filename role="special">.hg/hgrc</filename> definisce un hook <literal role="hook">outgoing</literal> locale, quell'hook verrà eseguito con il vostro account utente anche se non siete il proprietario di quel repository.</para>
     1.5  
     1.6        <note>
     1.7 -	<para id="x_1fa">Questo si applica se estraete cambiamenti da un repository operando su un file system locale o di rete. Se state effettuando l'estrazione via HTTP o SSH, qualsiasi hook <literal role="hook">outgoing</literal> verrà eseguito sul server con l'account utente che è stato usato per eseguire il processo server.</para>
     1.8 +	<para id="x_1fa">Questo avviene solo se estraete cambiamenti da un repository operando su un file system locale o di rete. Se state effettuando l'estrazione via HTTP o SSH, qualsiasi hook <literal role="hook">outgoing</literal> verrà eseguito sul server con l'account utente che è stato usato per eseguire il processo server.</para>
     1.9        </note>
    1.10  
    1.11        <para id="x_1fb">Per vedere quali hook sono definiti in un repository, usate il comando <command role="hg-cmd">hg showconfig hooks</command>. Se state lavorando in un repository, ma state comunicando con un repository di cui non siete i proprietari (e.g. usando <command role="hg-cmd">hg pull</command> o <command role="hg-cmd">hg incoming</command>), ricordate che sono gli hook dell'altro repository che dovreste controllare, non i vostri.</para>
    1.12 @@ -71,7 +71,7 @@
    1.13  
    1.14        <para id="x_1fe">Dato che Mercurial non propaga gli hook, se state collaborando con altre persone su un progetto comune, non dovreste presumere che gli altri stiano usando gli stessi hook Mercurial che state usando voi, o che i loro siano correttamente configurati. Dovreste documentare quali sono gli hook che vi aspettate siano usati dalle altre persone.</para>
    1.15  
    1.16 -      <para id="x_1ff">In una intranet aziendale, questo aspetto è in qualche modo più facile da controllare, dato che per esempio potete fornire una installazione <quote>standard</quote> di Mercurial su un file system NFS e usare un file <filename role="special">~/.hgrc</filename> globale per definire hook che tutti gli utenti vedranno. Tuttavia, come constateremo nella prossima sezione, anche questo approccio ha dei limiti.</para>
    1.17 +      <para id="x_1ff">In una intranet aziendale, questo aspetto è in qualche modo più facile da controllare, dato che per esempio potete fornire un'installazione <quote>standard</quote> di Mercurial su un file system NFS e usare un file <filename role="special">~/.hgrc</filename> globale per definire hook che verranno visti da tutti gli utenti. Tuttavia, come constateremo nella prossima sezione, anche questo approccio ha dei limiti.</para>
    1.18      </sect2>
    1.19  
    1.20      <sect2>
    1.21 @@ -79,7 +79,7 @@
    1.22  
    1.23        <para id="x_200">Mercurial vi consente di sostituire una definizione di hook attraverso la sua ridefinizione. Potete disabilitare un hook impostando il suo valore alla stringa vuota, o cambiare il suo comportamento come desiderate.</para>
    1.24  
    1.25 -      <para id="x_201">Se fate ricorso a un file <filename role="special">~/.hgrc</filename> di sistema o globale che definisce alcuni hook, dovreste quindi rendervi conto che i vostri utenti sono in grado di disabilitare o sostituire quegli hook.</para>
    1.26 +      <para id="x_201">Se fate ricorso a un file <filename role="special">~/.hgrc</filename> di sistema o globale che definisce alcuni hook, dovreste quindi tenere presente che i vostri utenti sono in grado di disabilitare o sostituire quegli hook.</para>
    1.27      </sect2>
    1.28  
    1.29      <sect2>
    1.30 @@ -87,9 +87,9 @@
    1.31  
    1.32        <para id="x_202">Talvolta potreste voler imporre il rispetto di una politica in modo che gli altri non siano in grado di aggirarla. Per esempio, potreste richiedere a ogni changeset di passare una rigorosa serie di test. La definizione di questo requisito attraverso un hook in un file <filename role="special">~/.hgrc</filename> globale non avrà effetto sui computer portatili degli utenti remoti, e naturalmente gli utenti locali potranno alterarla a piacimento sostituendo quell'hook.</para>
    1.33  
    1.34 -      <para id="x_203">Invece, potete istituire le vostre politiche sull'uso di Mercurial in modo che le persone siano tenute a propagare i cambiamenti attraverso un server <quote>canonico</quote> ben noto che avete messo in sicurezza e configurato adeguatamente.</para>
    1.35 -
    1.36 -      <para id="x_204">Questo risultato si può ottenere attraverso una combinazione di ingegneria sociale e tecnologia. Impostate un account con accesso ristretto; gli utenti possono trasmettere i cambiamenti attraverso la rete ai repository gestiti da questo account, ma non possono usare l'account per entrare sul server ed eseguire i normali comandi di shell. In questo scenario, un utente può effettuare il commit di un changeset che contiene tutte le porcherie che desidera.</para>
    1.37 +      <para id="x_203">Invece, potete istituire le vostre politiche sull'uso di Mercurial in modo che le persone siano tenute a propagare i cambiamenti attraverso un server <quote>ufficiale</quote> ben noto che avete messo in sicurezza e configurato adeguatamente.</para>
    1.38 +
    1.39 +      <para id="x_204">Questo risultato si può ottenere attraverso una combinazione di ingegneria sociale e tecnologia. Se impostate un account con accesso ristretto, gli utenti potranno trasmettere i cambiamenti attraverso la rete ai repository gestiti da questo account, ma non potranno usare l'account per entrare sul server ed eseguire i normali comandi di shell. In questo scenario, un utente può effettuare il commit di un changeset che contiene tutte le porcherie che desidera.</para>
    1.40  
    1.41        <para id="x_205">Quando qualcuno trasmette un changeset al server da cui tutti estraggono i cambiamenti, il server verificherà il changeset prima di accettarlo come permanente e lo rifiuterà se non riesce a passare i test. Se le persone si limitano a estrarre i cambiamenti da questo server di filtraggio, questo servirà ad assicurare che tutti i cambiamenti estratti dalle persone siano stati automaticamente controllati.</para>
    1.42  
    1.43 @@ -99,7 +99,7 @@
    1.44    <sect1 id="sec:hook:simple">
    1.45      <title>Una breve guida all'uso degli hook</title>
    1.46  
    1.47 -    <para id="x_212">Scrivere un hook Mercurial è facile. Cominciamo con un hook che viene invocato al termine dell'invocazione di <command role="hg-cmd">hg commit</command> e che stampa semplicemente l'hash del changeset appena creato. L'hook è chiamato <literal role="hook">commit</literal>.
    1.48 +    <para id="x_212">Scrivere un hook Mercurial è facile. Cominciamo con un hook che viene invocato al termine dell'esecuzione di <command role="hg-cmd">hg commit</command> e che stampa semplicemente l'hash del changeset appena creato. L'hook è chiamato <literal role="hook">commit</literal>.
    1.49      </para>
    1.50  
    1.51      <para id="x_213">Tutti gli hook seguono lo schema presentato in questo esempio.</para>
    1.52 @@ -113,7 +113,7 @@
    1.53  
    1.54        <para id="x_215">Vi capiterà piuttosto spesso di voler definire più di un hook per un particolare tipo di evento, come mostrato qui sotto.</para>
    1.55  
    1.56 -&interaction.hook.simple.ext;
    1.57 +      &interaction.hook.simple.ext;
    1.58  
    1.59        <para id="x_216">Mercurial vi permette di fare questo aggiungendo un'<emphasis>estensione</emphasis> alla fine del nome di un hook. Il nome di un hook si estende scrivendo il nome dell'hook, seguito da un punto (il carattere <quote><literal>.</literal></quote>), seguito da altro testo di vostra scelta. Per esempio, Mercurial eseguirà sia <literal>commit.foo</literal> che <literal>commit.bar</literal> all'occorrenza dell'evento <literal>commit</literal>.</para>
    1.60  
    1.61 @@ -129,13 +129,13 @@
    1.62  
    1.63        <para id="x_21a">Mercurial definisce un certo numero di eventi che accadono prima che un'attività cominci, o dopo che è cominciata ma prima che termini. Gli hook attivati da questi eventi hanno l'ulteriore capacità di determinare se l'attività può continuare o se verrà abortita.</para>
    1.64  
    1.65 -      <para id="x_21b">L'hook <literal role="hook">pretxncommit</literal> viene invocato dopo che un commit è stato completamente eseguito ma non è ancora concluso. In altre parole, i metadati che rappresentano il changeset sono stati scritti su disco, ma la transazione non ha ancora avuto il permesso di completarsi. L'hook <literal role="hook">pretxncommit</literal> ha la capacità di decidere se la transazione può completarsi oppure se deve essere abortita.</para>
    1.66 +      <para id="x_21b">L'hook <literal role="hook">pretxncommit</literal> viene invocato dopo che un commit è stato completamente eseguito ma non si è ancora concluso. In altre parole, i metadati che rappresentano il changeset sono stati scritti su disco, ma la transazione non ha ancora avuto il permesso di completarsi. L'hook <literal role="hook">pretxncommit</literal> ha la capacità di decidere se la transazione può completarsi oppure se deve essere abortita.</para>
    1.67  
    1.68        <para id="x_21c">Se l'hook <literal role="hook">pretxncommit</literal> termina con un codice di stato uguale a zero, la transazione può completare, il commit si conclude e l'hook <literal role="hook">commit</literal> viene eseguito. Se l'hook <literal role="hook">pretxncommit</literal> termina con un codice di stato diverso da zero, la transazione viene abortita, i metadati che rappresentano il changeset vengono cancellati e l'hook <literal role="hook">commit</literal> non viene eseguito.</para>
    1.69  
    1.70        &interaction.hook.simple.pretxncommit;
    1.71  
    1.72 -      <para id="x_21d">L'hook in questo esempio controlla che il messaggio di commit contenga un identificatore di bug. Se lo contiene, il commit può completare, altrimenti il commit viene abortito.</para>
    1.73 +      <para id="x_21d">In questo esempio, l'hook controlla che il messaggio di commit contenga un identificatore di bug. Se lo contiene, il commit può completare, altrimenti il commit viene abortito.</para>
    1.74  
    1.75      </sect2>
    1.76    </sect1>
    1.77 @@ -147,7 +147,7 @@
    1.78      <sect2 id="sec:hook:lang">
    1.79        <title>Scegliere la modalità di esecuzione del vostro hook</title>
    1.80  
    1.81 -      <para id="x_21f">Potete implementare un hook come un programma normale&emdash;tipicamente uno script di shell&emdash;o come una funzione Python che viene eseguita nell'ambito del processo Mercurial.</para>
    1.82 +      <para id="x_21f">Potete implementare un hook come un normale programma&emdash;tipicamente uno script di shell&emdash;o come una funzione Python che viene eseguita nell'ambito del processo Mercurial.</para>
    1.83  
    1.84        <para id="x_220">Implementare un hook come programma esterno ha il vantaggio di non richiedere alcuna conoscenza del funzionamento interno di Mercurial. Potete invocare i normali comandi Mercurial per ottenere tutte le informazioni aggiuntive di cui avete bisogno. Lo svantaggio è che gli hook esterni sono più lenti rispetto agli hook interni.</para>
    1.85  
    1.86 @@ -179,7 +179,7 @@
    1.87  
    1.88        <para id="x_228">Un hook eseguibile viene sempre eseguito con la sua directory corrente impostata alla directory radice del repository.</para>
    1.89  
    1.90 -      <para id="x_229">Ogni parametro di hook viene passato come una variabile di ambiente con il nome in maiuscolo preceduto dalla stringa <quote><literal>HG_</literal></quote>.</para>
    1.91 +      <para id="x_229">Ogni parametro di hook viene passato come una variabile d'ambiente con il nome in maiuscolo preceduto dalla stringa <quote><literal>HG_</literal></quote>.</para>
    1.92  
    1.93        <para id="x_22a">Con l'eccezione dei parametri di hook, Mercurial non imposta o modifica alcuna variabile d'ambiente quando esegue un hook. Questo è utile da ricordare se state scrivendo un hook globale che potrebbe venire invocato da un certo numero di utenti differenti con differenti variabili d'ambiente impostate. In ambienti multi-utente, non dovreste fare affidamento sul fatto che le variabili d'ambiente abbiano i valori che avete impostato nel vostro ambiente di lavoro durante il collaudo dell'hook.</para>
    1.94      </sect2>
    1.95 @@ -193,15 +193,15 @@
    1.96  
    1.97        <para id="x_22d">Il seguente frammento di un file <filename role="special">~/.hgrc</filename> di esempio illustra la sintassi e il significato delle nozioni appena descritte.</para>
    1.98        <programlisting>[hooks]
    1.99 -commit.example = python:mymodule.submodule.myhook</programlisting>
   1.100 -      <para id="x_22e">Quando Mercurial esegue l'hook <literal>commit.example</literal>, importa <literal>mymodule.submodule</literal>, cerca l'oggetto invocabile chiamato <literal>myhook</literal> e lo invoca.</para>
   1.101 +commit.esempio = python:miomodulo.sottomodulo.miohook</programlisting>
   1.102 +      <para id="x_22e">Quando Mercurial esegue l'hook <literal>commit.esempio</literal>, importa <literal>miomodulo.sottomodulo</literal>, cerca l'oggetto invocabile chiamato <literal>miohook</literal> e lo invoca.</para>
   1.103      </sect2>
   1.104  
   1.105      <sect2>
   1.106        <title>Implementare un hook interno</title>
   1.107  
   1.108        <para id="x_22f">Il più semplice hook interno non fa nulla, ma illustra la forma base della API degli hook:</para>
   1.109 -      <programlisting>def myhook(ui, repo, **kwargs):
   1.110 +      <programlisting>def miohook(ui, repo, **kwargs):
   1.111      pass</programlisting>
   1.112        <para id="x_230">Il primo argomento di un hook Python è sempre un oggetto <literal role="py-mod-mercurial.ui">mercurial.ui.ui</literal>. Il secondo è un oggetto repository, al momento sempre un'istanza di <literal role="py-mod-mercurial.localrepo">mercurial.localrepo.localrepository</literal>. Gli altri argomenti con nome seguono questi due argomenti. Quali argomenti con nome vengono passati dipende dall'hook che viene invocato, ma un hook può ignorare gli argomenti di cui non ha bisogno depositandoli in un dizionario di argomenti con nome, come succede con <literal>**kwargs</literal> qui sopra.</para>
   1.113  
   1.114 @@ -213,9 +213,9 @@
   1.115      <sect2>
   1.116        <title>Scrivere messaggi di commit significativi</title>
   1.117  
   1.118 -      <para id="x_231">&Egrave; difficile immaginare un messaggio di commit utile che sia anche molto breve. Il semplice hook <literal role="hook">pretxncommit</literal> dell'esempio seguente vi impedirà di esguire il commit di un changeset con un messaggio più piccolo di dieci byte.</para>
   1.119 -
   1.120 -&interaction.hook.msglen.go;
   1.121 +      <para id="x_231">&Egrave; difficile immaginare un messaggio di commit utile che sia anche molto breve. Il semplice hook <literal role="hook">pretxncommit</literal> dell'esempio seguente vi impedirà di esguire il commit di un changeset con un messaggio più piccolo di quindici byte.</para>
   1.122 +
   1.123 +      &interaction.hook.msglen.go;
   1.124      </sect2>
   1.125  
   1.126      <sect2>
   1.127 @@ -225,7 +225,7 @@
   1.128  
   1.129        <para id="x_233">Potete usare l'hook <literal role="hook">precommit</literal> o l'hook <literal role="hook">pretxncommit</literal> per scoprire se avete un problema di spazio bianco in coda. Se usate <literal role="hook">precommit</literal>, l'hook non saprà quali file state inserendo, quindi dovrà controllare ogni file modificato nel repository alla ricerca di spazio bianco in coda. Se volete inserire un cambiamento al solo file <filename>foo</filename>, ma il flie <filename>bar</filename> contiene spazio bianco in coda, effettuare un controllo tramite l'hook <literal role="hook">precommit</literal> vi impedirà di eseguire il commit di <filename>foo</filename> a causa dei problemi con <filename>bar</filename>. Questo comportamento non sembra corretto.</para>
   1.130  
   1.131 -      <para id="x_234">Se doveste scegliere l'hook <literal role="hook">pretxncommit</literal>, il controllo non avverrà fino al momento appena precedente il completamento della transizione di commit. Questo vi consentirà di controllare il problema solo sui file che verranno registrati. Tuttavia, se avete inserito il messaggio di commit interattivamente e l'hook fallisce, la transazione verrà abortita e dovrete riscrivere il messaggio di commit dopo aver corretto lo spazio bianco in coda e invocato ancora <command role="hg-cmd">hg commit</command>.</para>
   1.132 +      <para id="x_234">Se doveste scegliere l'hook <literal role="hook">pretxncommit</literal>, il controllo non avverrà fino al momento appena precedente il completamento della transazione di commit. Questo vi consentirà di controllare il problema solo sui file che verranno registrati. Tuttavia, se avete inserito il messaggio di commit interattivamente e l'hook fallisce, la transazione verrà abortita e dovrete riscrivere il messaggio di commit dopo aver corretto lo spazio bianco in coda e invocato ancora <command role="hg-cmd">hg commit</command>.</para>
   1.133  
   1.134        &interaction.ch09-hook.ws.simple;
   1.135  
   1.136 @@ -233,19 +233,19 @@
   1.137  
   1.138        &ch09-check_whitespace.py.lst;
   1.139  
   1.140 -      <para id="x_236">Questa versione è molto più complessa, ma anche molto più utile. Analizza un diff unificato per vedere se una qualsiasi riga aggiunge spazio bianco in coda e stampa il nome del file e il numero della riga di ogni occorrenza di questo tipo. Anche meglio, se il cambiamento aggiunge spazio bianco in coda, questo hook salva il messaggio di commit e stampa il nome del file salvato prima di uscire e dire a Mercurial di abortire la transazione, in modo che possiate usare l'opzione <option role="hg-opt-commit">-l filename</option> del comando <command role="hg-cmd">hg commit</command> per riutilizzare il messaggio di commit salvato una volta che avete corretto il problema.</para>
   1.141 +      <para id="x_236">Questa versione è molto più complessa, ma anche molto più utile. Analizza un diff unificato per vedere se una qualsiasi riga aggiunge spazio bianco in coda e stampa il nome del file e il numero della riga di ogni occorrenza di questo tipo. Anche meglio, se il cambiamento aggiunge spazio bianco in coda, questo hook salva il messaggio di commit e stampa il nome del file salvato prima di uscire e dire a Mercurial di abortire la transazione, in modo che possiate usare l'opzione <option role="hg-opt-commit">-l nomefile</option> del comando <command role="hg-cmd">hg commit</command> per riutilizzare il messaggio di commit salvato una volta che avete corretto il problema.</para>
   1.142  
   1.143        &interaction.ch09-hook.ws.better;
   1.144  
   1.145 -      <para id="x_237">Come ultima nota a margine, osservate in questo esempio l'uso della funzionalità di modifica sul posto di <command>sed</command> per eliminare lo spazio bianco in coda da un file. Questo impiego è sufficientemente conciso e utile che lo riprodurrò qui di seguito (usando <command>perl</command> per sicurezza).</para>
   1.146 -      <programlisting>perl -pi -e 's,\s+$,,' filename</programlisting>
   1.147 +      <para id="x_237">Come ultima nota a margine, osservate in questo esempio l'uso della funzione di modifica sul posto di <command>sed</command> per eliminare lo spazio bianco in coda da un file. Questo impiego è sufficientemente conciso e utile che lo riprodurrò qui di seguito (usando <command>perl</command> per sicurezza).</para>
   1.148 +      <programlisting>perl -pi -e 's,\s+$,,' nomefile</programlisting>
   1.149  
   1.150      </sect2>
   1.151    </sect1>
   1.152    <sect1>
   1.153      <title>Hook inclusi</title>
   1.154  
   1.155 -    <para id="x_238">Mercurial viene distribuito con diversi hook inclusi che potete trovare nella directory <filename class="directory">hgext</filename> dell'albero dei sorgenti di Mercurial. Se state usando un pacchetto eseguibile di Mercurial, gli hook si trovano nella directory <filename class="directory">hgext</filename> posizionata ovunque il vostro pacchetto abbia installato Mercurial.</para>
   1.156 +    <para id="x_238">Mercurial viene distribuito con diversi hook inclusi che potete trovare nella directory <filename class="directory">hgext</filename> dell'albero dei sorgenti di Mercurial. Se state usando un pacchetto precompilato di Mercurial, gli hook si trovano nella directory <filename class="directory">hgext</filename> posizionata ovunque il vostro pacchetto abbia installato Mercurial.</para>
   1.157  
   1.158      <sect2>
   1.159        <title><literal role="hg-ext">acl</literal>&emdash;controllo di accesso per parti di un repository</title>
   1.160 @@ -276,22 +276,22 @@
   1.161  
   1.162  	<para id="x_242">La sezione <literal role="rc-acl.allow">acl.allow</literal> controlla gli utenti a cui è permesso aggiungere changeset al repository. Se questa sezione non è presente, il permesso viene concesso a tutti gli utenti a cui non viene esplicitamente negato. Se questa sezione è presente, il permesso viene negato a tutti gli utenti a cui non viene esplicitamente concesso (quindi una sezione vuota significa che il permesso viene negato a tutti gli utenti).</para>
   1.163  
   1.164 -	<para id="x_243">La sezione <literal role="rc-acl.deny">acl.deny</literal> determina a quali utenti viene impedito di aggiungere changeset al repository. Se questa sezione non è presente o è vuota, tutti gli utenti hanno il permesso di aggiungere modifiche.</para>
   1.165 +	<para id="x_243">La sezione <literal role="rc-acl.deny">acl.deny</literal> determina quali sono gli utenti a cui viene impedito di aggiungere changeset al repository. Se questa sezione non è presente o è vuota, tutti gli utenti hanno il permesso di aggiungere modifiche.</para>
   1.166  
   1.167  	<para id="x_244">La sintassi per le sezioni <literal role="rc-acl.allow">acl.allow</literal> e <literal role="rc-acl.deny">acl.deny</literal> è la stessa. Sulla sinistra di ogni voce si trova un pattern di tipo glob che corrisponde a file e directory relativi alla radice del repository, sulla destra si trova un nome utente.</para>
   1.168  
   1.169 -	<para id="x_245">Nell'esempio seguente, l'utente <literal>docwriter</literal> può trasmettere cambiamenti solo al sottoalbero <filename class="directory">docs</filename> del repository, mentre l'utente <literal>intern</literal> può trasmettere cambiamenti a qualsiasi file o directory tranne <filename class="directory">source/sensitive</filename>.
   1.170 +	<para id="x_245">Nell'esempio seguente, l'utente <literal>docwriter</literal> può trasmettere cambiamenti solo al sottoalbero <filename class="directory">doc</filename> del repository, mentre l'utente <literal>intern</literal> può trasmettere cambiamenti a qualsiasi file o directory tranne <filename class="directory">sorgenti/sensibili</filename>.
   1.171  	</para>
   1.172  	<programlisting>[acl.allow]
   1.173 -docs/** = docwriter
   1.174 +doc/** = docwriter
   1.175  [acl.deny]
   1.176 -source/sensitive/** = intern</programlisting>
   1.177 +sorgenti/sensibili/** = intern</programlisting>
   1.178  
   1.179        </sect3>
   1.180        <sect3>
   1.181  	<title>Collaudo e risoluzione dei problemi</title>
   1.182  
   1.183 -	<para id="x_246">Se volete collaudare l'hook <literal role="hg-ext">acl</literal>, eseguitelo abilitando le informazioni di debug di Mercurial abilitate. Dato che probabilmente lo eseguirete su un server dove non è conveniente (e talvolta nemmeno possibile) passare l'opzione <option role="hg-opt-global">--debug</option>, non dimenticatevi che potete abilitare le informazioni di debug nel vostro file <filename role="special">~/.hgrc</filename>:
   1.184 +	<para id="x_246">Se volete collaudare l'hook <literal role="hg-ext">acl</literal>, eseguitelo abilitando le informazioni di debug di Mercurial. Dato che probabilmente lo eseguirete su un server dove non è conveniente (e talvolta nemmeno possibile) passare l'opzione <option role="hg-opt-global">--debug</option>, non dimenticatevi che potete abilitare le informazioni di debug nel vostro file <filename role="special">~/.hgrc</filename>:
   1.185  	</para>
   1.186  	<programlisting>[ui]
   1.187  debug = true</programlisting>
   1.188 @@ -308,9 +308,10 @@
   1.189  
   1.190        <para id="x_249">L'hook aggiunge al bug un commento che somiglia a questo (potete configurare i contenuti del commento, come vedrete fra un attimo):</para>
   1.191        <programlisting>Changeset aad8b264143a, creato da Mario Rossi
   1.192 -	&lt;mario.rossi@example.com&gt; nel repository vattelapesca, fa riferimento
   1.193 -	a questo bug. Per i dettagli completi, si veda
   1.194 -	http://hg.domain.com/frobnitz?cmd=changeset;node=aad8b264143a
   1.195 +	&lt;mario.rossi@example.com&gt; nel repository vattelapesca,
   1.196 +    fa riferimento a questo bug.
   1.197 +    Per i dettagli completi, si veda
   1.198 +	http://hg.example.com/vattelapesca?cmd=changeset;node=aad8b264143a
   1.199  	Descrizione del changeset: risolto bug 10483 proteggendo il codice da alcuni
   1.200  	puntatori NULL.</programlisting>
   1.201        <para id="x_24a">Il valore di questo hook è che automatizza il processo di aggiornamento di un bug ogni volta che un changeset vi fa riferimento. Se lo configurate in maniera adeguata, l'hook faciliterà la navigazione diretta da un bug su Bugzilla a un changeset che si riferisce a quel bug.</para>
   1.202 @@ -331,7 +332,7 @@
   1.203  
   1.204  	<para id="x_24f">A causa della natura specializzata dell'hook e dato che Bugzilla non è stato implementato con questo tipo di integrazioni in mente, configurare questo hook è un processo piuttosto complicato.</para>
   1.205  
   1.206 -	<para id="x_250">Prima di cominciare, dovete installare la libreria di interfaccia Python per MySQL sulla macchina (o le macchine) dove intendete eseguire l'hook. Se non è disponibile sotto forma di pacchetto eseguibile per il vostro sistema, potete scaricarla da <citation>web:mysql-python</citation>.
   1.207 +	<para id="x_250">Prima di cominciare, dovete installare la libreria di interfaccia Python per MySQL sulla macchina (o le macchine) dove intendete eseguire l'hook. Se non è disponibile sotto forma di pacchetto precompilato per il vostro sistema, potete scaricarla da <citation>web:mysql-python</citation>.
   1.208  	</para>
   1.209  
   1.210  	<para id="x_251">Le informazioni di configurazione per questo hook si trovano nella sezione <literal role="rc-bugzilla">bugzilla</literal> del vostro file <filename role="special">~/.hgrc</filename>.
   1.211 @@ -351,8 +352,7 @@
   1.212  	  <listitem><para id="x_257"><envar role="rc-item-bugzilla">notify</envar>: se volete che Bugzilla spedisca un'email di notifica agli interessati dopo che questo hook ha aggiunto un commento a un bug, avrete bisogno che questo hook esegua un comando ogni volta che aggiorna il database. Il comando da eseguire dipende da dove avete installato Bugzilla, ma tipicamente somiglierà al seguente, se avete installato Bugzilla in <filename class="directory">/var/www/html/bugzilla</filename>:</para>
   1.213  	    <programlisting>cd /var/www/html/bugzilla &amp;&amp;
   1.214  	      ./processmail %s nessuno@example.com</programlisting>
   1.215 -	  </listitem>
   1.216 -	  <listitem><para id="x_258">Il programma <literal>processmail</literal> di Bugzilla si aspetta che gli vengano passati un identificatore di bug (l'hook sostituisce <quote><literal>%s</literal></quote> con l'identificatore di bug) e un indirizzo email. Si aspetta anche di essere in grado di scrivere su alcuni file nella directory in cui viene eseguito. Se Bugzilla e questo hook non sono installati sulla stessa macchina, dovrete trovare un modo per eseguire <literal>processmail</literal> sul server dove Bugzilla è installato.</para>
   1.217 +	  <para id="x_258">Il programma <literal>processmail</literal> di Bugzilla si aspetta che gli vengano passati un identificatore di bug (l'hook sostituisce <quote><literal>%s</literal></quote> con l'identificatore di bug) e un indirizzo email. Si aspetta anche di essere in grado di scrivere su alcuni file nella directory in cui viene eseguito. Se Bugzilla e questo hook non sono installati sulla stessa macchina, dovrete trovare un modo per eseguire <literal>processmail</literal> sul server dove Bugzilla è installato.</para>
   1.218  	  </listitem></itemizedlist>
   1.219  
   1.220        </sect3>
   1.221 @@ -364,10 +364,10 @@
   1.222  	<para id="x_25a">Ogni elemento nella sezione <literal role="rc-usermap">usermap</literal> contiene un indirizzo email sulla sinistra e un nome utente Bugzilla sulla destra.</para>
   1.223  	<programlisting>[usermap]
   1.224  maria.bianchi@example.com = maria</programlisting>
   1.225 -	<para id="x_25b">Potete tenere i dati della sezione <literal role="rc-usermap">usermap</literal> in un normale file <filename role="special">~/.hgrc</filename>, oppure dire all'hook <literal role="hg-ext">bugzilla</literal> di leggere le informazioni da un file <filename>usermap</filename> esterno. In quest'ultimo caso, potete memorizzare i dati del file <filename>usermap</filename> separatamente in (per esempio) un repository modificabile dall'utente. Questo vi permette di dare ai vostri utenti la possibilità di mantenere le proprie voci nella sezione <envar role="rc-item-bugzilla">usermap</envar>. Il file <filename role="special">~/.hgrc</filename> principale potrebbe somigliare a questo:</para>
   1.226 +	<para id="x_25b">Potete tenere i dati della sezione <literal role="rc-usermap">usermap</literal> in un normale file <filename role="special">~/.hgrc</filename>, oppure dire all'hook <literal role="hg-ext">bugzilla</literal> di leggere le informazioni da un file <filename>usermap</filename> esterno. In quest'ultimo caso, potete memorizzare i dati del file <filename>usermap</filename> separatamente in un repository modificabile dall'utente, per esempio. Questo vi permette di dare ai vostri utenti la possibilità di mantenere le proprie voci nella sezione <envar role="rc-item-bugzilla">usermap</envar>. Il file <filename role="special">~/.hgrc</filename> principale potrebbe somigliare a questo:</para>
   1.227  	<programlisting># il normale file hgrc fa riferimento a un file di correlazioni esterno
   1.228  [bugzilla]
   1.229 -usermap = /home/hg/repos/userdata/bugzilla-usermap.conf</programlisting>
   1.230 +usermap = /home/hg/repos/datiutente/bugzilla-usermap.conf</programlisting>
   1.231  	<para id="x_25c">Mentre il file <filename>usermap</filename> a cui fa riferimento potrebbe somigliare a questo:</para>
   1.232  	<programlisting># bugzilla-usermap.conf - all'interno di un repository Mercurial
   1.233  [usermap]
   1.234 @@ -379,14 +379,14 @@
   1.235  
   1.236  	<para id="x_25d">Potete configurare il testo che questo hook aggiunge come commento specificandolo sotto forma di template Mercurial. Diverse voci del file <filename role="special">~/.hgrc</filename> (sempre nella sezione <literal role="rc-bugzilla">bugzilla</literal>) controllano questo comportamento.</para>
   1.237  	<itemizedlist>
   1.238 -	  <listitem><para id="x_25e"><literal>strip</literal>: il numero di parti iniziali da eliminare dal percorso di un repository per costruire un percorso parziale da usare in un URL. Per esempio, se i repository sul vostro server si trovano nella directory <filename class="directory">/home/hg/repos</filename>, e voi avete un repository il cui percorso è <filename class="directory">/home/hg/repos/app/tests</filename>, allora impostando <literal>strip</literal> a <literal>4</literal> otterrete il percorso parziale <filename class="directory">app/tests</filename>. L'hook renderà disponibile questo percorso parziale con il nome <literal>webroot</literal> durante l'espansione di un template.</para>
   1.239 +	  <listitem><para id="x_25e"><literal>strip</literal>: il numero di parti iniziali da eliminare dal percorso di un repository per costruire un percorso parziale da usare in un URL. Per esempio, se i repository sul vostro server si trovano nella directory <filename class="directory">/home/hg/repos</filename>, e voi avete un repository il cui percorso è <filename class="directory">/home/hg/repos/app/test</filename>, allora impostando <literal>strip</literal> a <literal>4</literal> otterrete il percorso parziale <filename class="directory">app/test</filename>. L'hook renderà disponibile questo percorso parziale con il nome <literal>webroot</literal> durante l'espansione di un template.</para>
   1.240  	  </listitem>
   1.241  	  <listitem><para id="x_25f"><literal>template</literal>: il testo del template da usare. In aggiunta alle solite variabili relative ai changeset, questo template può usare <literal>hgweb</literal> (il valore dell'elemento di configurazione <literal>hgweb</literal> menzionato in precedenza) e <literal>webroot</literal> (il percorso costruito usando l'elemento <literal>strip</literal> appena descritto).</para>
   1.242  	  </listitem></itemizedlist>
   1.243  
   1.244  	<para id="x_260">In più, potete aggiungere un elemento <envar role="rc-item-web">baseurl</envar> alla sezione <literal role="rc-web">web</literal> del vostro file <filename role="special">~/.hgrc</filename>. L'hook <literal role="hg-ext">bugzilla</literal> lo renderà disponibile durante l'espansione di un template, come la stringa di base da usare nel costruire un URL che permetterà agli utenti di navigare da un commento Bugzilla verso un changeset correlato. Ecco un esempio di come usare questo elemento:</para>
   1.245  	<programlisting>[web]
   1.246 -baseurl = http://hg.domain.com/</programlisting>
   1.247 +baseurl = http://hg.example.com/</programlisting>
   1.248  
   1.249  	<para id="x_261">Ecco un esempio dell'insieme di informazioni di configurazione da usare per l'hook <literal role="hg-ext">bugzilla</literal>.</para>
   1.250  
   1.251 @@ -411,7 +411,7 @@
   1.252  	<para id="x_267">Non sembra che l'indirizzo email passato a <filename>processmail</filename> abbia importanza.</para>
   1.253  
   1.254  	<para id="x_268">Se la vostra sezione <literal role="rc-usermap">usermap</literal> non è impostata correttamente, gli utenti vedranno un messaggio di errore stampato dall'hook <literal role="hg-ext">bugzilla</literal> al momento di trasmettere i cambiamenti al server. Il messaggio di errore somiglierà al seguente:</para>
   1.255 -	<programlisting>cannot find bugzilla user id for mario.rossi@example.com</programlisting>
   1.256 +	<programlisting>impossibile trovare un nome utente bugzilla per mario.rossi@example.com</programlisting>
   1.257  	<para id="x_269">Questo significa che l'indirizzo email dell'utente Mercurial, <literal>mario.rossi@example.com</literal>, non è un nome utente Bugzilla valido, né possiede una voce nella vostra sezione <literal role="rc-usermap">usermap</literal> che lo metta in relazione con un nome utente Bugzilla valido.</para>
   1.258  
   1.259        </sect3>    
   1.260 @@ -422,9 +422,9 @@
   1.261  
   1.262        <para id="x_26a">Sebbene il server web predefinito di Mercurial fornisca i feed RSS dei cambiamenti per ogni repository, molte persone preferiscono ricevere le notifiche dei cambiamenti via email. L'hook <literal role="hg-ext">notify</literal> vi permette di inviare notifiche a un insieme di indirizzi email ogni volta che arrivano changeset a cui quelle persone sono interessate.</para>
   1.263  
   1.264 -      <para id="x_26b">Come l'hook <literal role="hg-ext">bugzilla</literal>, anche l'hook <literal role="hg-ext">notify</literal> è guidato da un template, in modo che possiate personalizzare i contenuti dei messaggi di notifica inviati.</para>
   1.265 -
   1.266 -      <para id="x_26c">Di default, l'hook <literal role="hg-ext">notify</literal> include un diff di ogni changeset che spedisce. Questa funzione vi permette di limitare le dimensioni del diff, oppure di disattivarle interamente, ma è utile per consentire agli interessati di revisionare i cambiamenti immediatamente piuttosto che obbligarli a cliccare per seguire un URL.</para>
   1.267 +      <para id="x_26b">Come l'hook <literal role="hg-ext">bugzilla</literal>, anche l'hook <literal role="hg-ext">notify</literal> è guidato da un template, in modo che possiate personalizzare il contenuto dei messaggi di notifica inviati.</para>
   1.268 +
   1.269 +      <para id="x_26c">Di default, l'hook <literal role="hg-ext">notify</literal> include un diff di ogni changeset che spedisce, ma potete limitare le dimensioni del diff oppure disattivarlo interamente. L'inclusione del diff è utile per consentire agli interessati di revisionare i cambiamenti immediatamente piuttosto che obbligarli a cliccare per seguire un URL.</para>
   1.270  
   1.271        <sect3>
   1.272  	<title>Configurare l'hook <literal role="hg-ext">notify</literal></title>
   1.273 @@ -442,7 +442,7 @@
   1.274  	  </listitem>
   1.275  	  <listitem><para id="x_270"><envar role="rc-item-notify">config</envar>: il percorso di un file di configurazione che contiene le informazioni di sottoscrizione. Questo viene tenuto separato dal file <filename role="special">~/.hgrc</filename> principale in modo che possiate mantenerlo in un proprio repository. Le persone possono poi clonare quel repository, aggiornare le proprie sottoscrizioni e trasmettere i cambiamenti al vostro server.</para>
   1.276  	  </listitem>
   1.277 -	  <listitem><para id="x_271"><envar role="rc-item-notify">strip</envar>: il numero di parti iniziali da eliminare dal percorso di un repository quando state decidendo se è possibile sottoscriversi alle notifiche per un repository. Per esempio, se i repository sul vostro server si trovano in <filename class="directory">/home/hg/repos</filename>, e <literal role="hg-ext">notify</literal> sta considerando un repository chiamato <filename class="directory">/home/hg/repos/shared/test</filename>, impostare <envar role="rc-item-notify">strip</envar> a <literal>4</literal> farà in modo che <literal role="hg-ext">notify</literal> restringa il percorso da considerare a <filename class="directory">shared/test</filename> e associ le sottoscrizioni a questo percorso.</para>
   1.278 +	  <listitem><para id="x_271"><envar role="rc-item-notify">strip</envar>: il numero di parti iniziali da eliminare dal percorso di un repository quando state decidendo se è possibile sottoscriversi alle notifiche per un repository. Per esempio, se i repository sul vostro server si trovano in <filename class="directory">/home/hg/repos</filename>, e <literal role="hg-ext">notify</literal> sta considerando un repository chiamato <filename class="directory">/home/hg/repos/condivisi/test</filename>, impostare <envar role="rc-item-notify">strip</envar> a <literal>4</literal> farà in modo che <literal role="hg-ext">notify</literal> restringa il percorso da considerare a <filename class="directory">condivisi/test</filename> e associ le sottoscrizioni a questo percorso.</para>
   1.279  	  </listitem>
   1.280  	  <listitem><para id="x_272"><envar role="rc-item-notify">template</envar>: il testo del template da usare per inviare i messaggi. Questo specifica i contenuti sia delle intestazioni che del corpo del messaggio.</para>
   1.281  	  </listitem>
   1.282 @@ -477,7 +477,8 @@
   1.283        <title>Esecuzione degli hook interni</title>
   1.284  
   1.285        <para id="x_279">Un hook interno viene invocato con argomenti della forma seguente:</para>
   1.286 -      <programlisting>def myhook(ui, repo, **kwargs): pass</programlisting>
   1.287 +      <programlisting>def miohook(ui, repo, **kwargs):
   1.288 +    pass</programlisting>
   1.289        <para id="x_27a">Il parametro <literal>ui</literal> è un oggetto di tipo <literal role="py-mod-mercurial.ui">mercurial.ui.ui</literal>. Il parametro <literal>repo</literal> è un oggetto di tipo <literal role="py-mod-mercurial.localrepo">mercurial.localrepo.localrepository</literal>. I nomi e i valori dei parametri <literal>**kwargs</literal> dipendono dall'hook coinvolto, ma hanno le seguenti caratteristiche comuni:</para>
   1.290        <itemizedlist>
   1.291  	<listitem><para id="x_27b">Se un parametro si chiama <literal>node</literal> o <literal>parentN</literal>, conterrà un identificatore esadecimale di changeset. La stringa vuota viene usata per rappresentare l'identificatore di changeset <quote>nullo</quote> invece di una stringa di zeri.</para>
   1.292 @@ -702,7 +703,7 @@
   1.293  
   1.294        <para id="x_2c7">Questo hook può accedere ai metadati associati ai changeset in procinto di essere aggiunti, ma dovrebbe evitare di modificarli in maniera permanente. L'hook deve anche evitare di modificare la directory di lavoro.</para>
   1.295  
   1.296 -      <para id="x_2c8">Se altri processi Mercurial accedono a questo repository mentre questo hook è in esecuzione, saranno in grado di vedere i changeset quasi aggiunti come se fossero permanenti. Questo potrebbe portare a condizioni di corsa critica se non eseguite i passi necessari per evitarle.</para>
   1.297 +      <para id="x_2c8">Se altri processi Mercurial accedono al repository mentre questo hook è in esecuzione, saranno in grado di vedere i changeset quasi aggiunti come se fossero permanenti. Questo potrebbe portare a condizioni di corsa critica se non eseguite i passi necessari per evitarle.</para>
   1.298  
   1.299        <para id="x_2c9">Questo hook può essere usato per esaminare automaticamente un gruppo di changeset. Se l'hook fallisce, tutti i changeset vengono <quote>respinti</quote> quando la transazione viene abortita.</para>
   1.300  
   1.301 @@ -725,7 +726,7 @@
   1.302  
   1.303        <para id="x_2d0">Questo hook può accedere ai metadati associati al changeset in procinto di essere inserito, ma dovrebbe evitare di modificarli in maniera permanente. L'hook deve anche evitare di modificare la directory di lavoro.</para>
   1.304  
   1.305 -      <para id="x_2d1">Se altri processi Mercurial accedono a questo repository mentre questo hook è in esecuzione, saranno in grado di vedere i changeset quasi aggiunti come se fossero permanenti. Questo potrebbe portare a condizioni di corsa critica se non eseguite i passi necessari per evitarle.</para>
   1.306 +      <para id="x_2d1">Se altri processi Mercurial accedono al repository mentre questo hook è in esecuzione, saranno in grado di vedere i changeset quasi aggiunti come se fossero permanenti. Questo potrebbe portare a condizioni di corsa critica se non eseguite i passi necessari per evitarle.</para>
   1.307  
   1.308        <para id="x_2d2">I parametri di questo hook sono i seguenti.</para>
   1.309  
   1.310 @@ -741,9 +742,9 @@
   1.311      </sect2>
   1.312  
   1.313      <sect2 id="sec:hook:preupdate">
   1.314 -      <title><literal role="hook">preupdate</literal>&emdash;prima di eseguire un aggiornamento o un'unione nella directory di lavoro</title>
   1.315 -
   1.316 -      <para id="x_2d7">Questo hook viene eseguito prima di cominciare un aggiornamento o un'unione nella directory di lavoro. Viene eseguito solo se i normali controlli effettuati da Mercurial prima di un aggiornamento determinano che l'aggiornamento o l'unione possono procedere. Se l'hook ha successo, l'aggiornamento o l'unione possono procedere, ma se fallisce, l'aggiornameno o l'unione non vengono cominciati.</para>
   1.317 +      <title><literal role="hook">preupdate</literal>&emdash;prima di eseguire un aggiornamento o un'unione della directory di lavoro</title>
   1.318 +
   1.319 +      <para id="x_2d7">Questo hook viene eseguito prima di cominciare un aggiornamento o un'unione della directory di lavoro. Viene eseguito solo se i normali controlli effettuati da Mercurial prima di un aggiornamento determinano che l'aggiornamento o l'unione possono procedere. Se l'hook ha successo, l'aggiornamento o l'unione possono procedere, ma se fallisce, l'aggiornameno o l'unione non vengono cominciati.</para>
   1.320  
   1.321        <para id="x_2d8">I parametri di questo hook sono i seguenti.</para>
   1.322        <itemizedlist>
   1.323 @@ -775,9 +776,9 @@
   1.324      </sect2>
   1.325  
   1.326      <sect2 id="sec:hook:update">
   1.327 -      <title><literal role="hook">update</literal>&emdash;dopo aver eseguito un aggiornamento o un'unione nella directory di lavoro</title>
   1.328 -
   1.329 -      <para id="x_2e3">Questo hook viene eseguito dopo il completamento di un aggiornamento o di un'unione nella directory di lavoro. Dato che un'unione può fallire (nel caso il comando esterno <command>hgmerge</command> non sia in grado di risolvere i conflitti in un file), questo hook comunica se l'aggiornamento o l'unione sono stati completati in maniera pulita.</para>
   1.330 +      <title><literal role="hook">update</literal>&emdash;dopo aver eseguito un aggiornamento o un'unione della directory di lavoro</title>
   1.331 +
   1.332 +      <para id="x_2e3">Questo hook viene eseguito dopo il completamento di un aggiornamento o di un'unione della directory di lavoro. Dato che un'unione può fallire (nel caso il comando esterno <command>hgmerge</command> non sia in grado di risolvere i conflitti in un file), questo hook comunica se l'aggiornamento o l'unione sono stati completati in maniera pulita.</para>
   1.333  
   1.334        <para id="x_ffe">I parametri di questo hook sono i seguenti.</para>
   1.335        <itemizedlist>
     2.1 --- a/it/examples/auto-snippets.xml	Thu Aug 13 14:23:29 2009 +0200
     2.2 +++ b/it/examples/auto-snippets.xml	Thu Aug 13 18:57:50 2009 +0200
     2.3 @@ -1,8 +1,8 @@
     2.4  <!ENTITY ch06-apache-config.lst SYSTEM "results/ch06-apache-config.lst.lxo">
     2.5 -<!ENTITY ch09-check_whitespace.py.lst SYSTEM "results/ch09-check_whitespace.py.lst.lxo">
     2.6 -<!ENTITY ch10-bugzilla-config.lst SYSTEM "results/ch10-bugzilla-config.lst.lxo">
     2.7 -<!ENTITY ch10-notify-config-mail.lst SYSTEM "results/ch10-notify-config-mail.lst.lxo">
     2.8 -<!ENTITY ch10-notify-config.lst SYSTEM "results/ch10-notify-config.lst.lxo">
     2.9 +<!ENTITY ch09-check_whitespace.py.lst SYSTEM "ch09-check_whitespace.py.lst.it">
    2.10 +<!ENTITY ch10-bugzilla-config.lst SYSTEM "ch10-bugzilla-config.lst.it">
    2.11 +<!ENTITY ch10-notify-config-mail.lst SYSTEM "ch10-notify-config-mail.lst.it">
    2.12 +<!ENTITY ch10-notify-config.lst SYSTEM "ch10-notify-config.lst.it">
    2.13  <!ENTITY interaction.backout.init SYSTEM "backout.init.it">
    2.14  <!ENTITY interaction.backout.manual.backout SYSTEM "backout.manual.backout.it">
    2.15  <!ENTITY interaction.backout.manual.cat SYSTEM "backout.manual.cat.it">
    2.16 @@ -80,8 +80,8 @@
    2.17  <!ENTITY interaction.ch04-resolve.merge SYSTEM "ch04-resolve.merge.it">
    2.18  <!ENTITY interaction.ch04-resolve.pull SYSTEM "ch04-resolve.pull.it">
    2.19  <!ENTITY interaction.ch04-resolve.right SYSTEM "ch04-resolve.right.it">
    2.20 -<!ENTITY interaction.ch09-hook.ws.better SYSTEM "results/ch09-hook.ws.better.lxo">
    2.21 -<!ENTITY interaction.ch09-hook.ws.simple SYSTEM "results/ch09-hook.ws.simple.lxo">
    2.22 +<!ENTITY interaction.ch09-hook.ws.better SYSTEM "ch09-hook.ws.better.it">
    2.23 +<!ENTITY interaction.ch09-hook.ws.simple SYSTEM "ch09-hook.ws.simple.it">
    2.24  <!ENTITY interaction.ch10-multiline.go SYSTEM "results/ch10-multiline.go.lxo">
    2.25  <!ENTITY interaction.ch10-multiline.orig.go SYSTEM "results/ch10-multiline.orig.go.lxo">
    2.26  <!ENTITY interaction.ch11-qdelete.convert SYSTEM "results/ch11-qdelete.convert.lxo">
    2.27 @@ -150,10 +150,10 @@
    2.28  <!ENTITY interaction.filenames.glob.starstar SYSTEM "filenames.glob.starstar.it">
    2.29  <!ENTITY interaction.filenames.wdir-relname SYSTEM "filenames.wdir-relname.it">
    2.30  <!ENTITY interaction.filenames.wdir-subdir SYSTEM "filenames.wdir-subdir.it">
    2.31 -<!ENTITY interaction.hook.msglen.go SYSTEM "results/hook.msglen.go.lxo">
    2.32 -<!ENTITY interaction.hook.simple.ext SYSTEM "results/hook.simple.ext.lxo">
    2.33 -<!ENTITY interaction.hook.simple.init SYSTEM "results/hook.simple.init.lxo">
    2.34 -<!ENTITY interaction.hook.simple.pretxncommit SYSTEM "results/hook.simple.pretxncommit.lxo">
    2.35 +<!ENTITY interaction.hook.msglen.go SYSTEM "hook.msglen.go.it">
    2.36 +<!ENTITY interaction.hook.simple.ext SYSTEM "hook.simple.ext.it">
    2.37 +<!ENTITY interaction.hook.simple.init SYSTEM "hook.simple.init.it">
    2.38 +<!ENTITY interaction.hook.simple.pretxncommit SYSTEM "hook.simple.pretxncommit.it">
    2.39  <!ENTITY interaction.issue29.go SYSTEM "issue29.go.it">
    2.40  <!ENTITY interaction.mq.dodiff.diff SYSTEM "results/mq.dodiff.diff.lxo">
    2.41  <!ENTITY interaction.mq.guards.init SYSTEM "results/mq.guards.init.lxo">
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/it/examples/ch09-check_whitespace.py.lst.it	Thu Aug 13 18:57:50 2009 +0200
     3.3 @@ -0,0 +1,49 @@
     3.4 +<!-- BEGIN ch09/check_whitespace.py.lst -->
     3.5 +<programlisting>#!/usr/bin/env python
     3.6 +#
     3.7 +# salvate il file come .hg/controllo_spazio_bianco.py e rendetelo eseguibile
     3.8 +
     3.9 +import re
    3.10 +
    3.11 +def spazio_bianco_in_coda(righe_di_diff):
    3.12 +    # 
    3.13 +    numriga, intestazione = 0, False
    3.14 +
    3.15 +    for riga in righe_di_diff:
    3.16 +        if intestazione:
    3.17 +            # ricorda il nome del file coinvolto in questo diff
    3.18 +            m = re.match(r'(?:---|\+\+\+) ([^\t]+)', riga)
    3.19 +            if m and m.group(1) != '/dev/null':
    3.20 +                nomefile = m.group(1).split('/', 1)[-1]
    3.21 +            if riga.startswith('+++ '):
    3.22 +                intestazione = False
    3.23 +            continue
    3.24 +        if riga.startswith('diff '):
    3.25 +            intestazione = True
    3.26 +            continue
    3.27 +        # intestazione - salva il numero di riga
    3.28 +        m = re.match(r'@@ -\d+,\d+ \+(\d+),', riga)
    3.29 +        if m:
    3.30 +            numriga = int(m.group(1))
    3.31 +            continue
    3.32 +        # corpo - cerca una riga aggiunta con spazio bianco in coda
    3.33 +        m = re.match(r'\+.*\s$', riga)
    3.34 +        if m:
    3.35 +            yield nomefile, numriga
    3.36 +        if riga and riga[0] in ' +':
    3.37 +            numriga += 1
    3.38 +
    3.39 +if __name__ == '__main__':
    3.40 +    import os, sys
    3.41 +    
    3.42 +    aggiunte = 0
    3.43 +    for nomefile, numriga in spazio_bianco_in_coda(os.popen('hg export tip')):
    3.44 +        print &gt;&gt; sys.stderr, ('%s, riga %d: aggiunto spazio bianco in coda' %
    3.45 +                              (nomefile, numriga))
    3.46 +        aggiunte += 1
    3.47 +    if aggiunte:
    3.48 +        # salva il messaggio di commit in modo da non doverlo digitare di nuovo
    3.49 +        os.system('hg tip --template "{desc}" &gt; .hg/commit.save')
    3.50 +        print &gt;&gt; sys.stderr, 'messaggio di commit salvato nel file .hg/commit.save'
    3.51 +        sys.exit(1)</programlisting>
    3.52 +<!-- END ch09/check_whitespace.py.lst -->
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/it/examples/ch09-hook.ws.better.it	Thu Aug 13 18:57:50 2009 +0200
     4.3 @@ -0,0 +1,20 @@
     4.4 +<!-- BEGIN ch09/hook.ws.better -->
     4.5 +<screen><prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
     4.6 +[hooks]
     4.7 +pretxncommit.spazio_bianco = .hg/controllo_spazio_bianco.py
     4.8 +<prompt>$</prompt> <userinput>echo 'a ' &gt;&gt; a</userinput>
     4.9 +<prompt>$</prompt> <userinput>hg commit -A -m 'Aggiunge una nuova riga con spazio bianco in coda.'</userinput>
    4.10 +a, riga 2: aggiunto spazio bianco in coda
    4.11 +messaggio di commit salvato nel file .hg/commit.save
    4.12 +transazione abortita!
    4.13 +ripristino completato
    4.14 +fallimento: l'hook pretxncommit.spazio_bianco è terminato con codice di stato 1
    4.15 +<prompt>$</prompt> <userinput>sed -i 's, *$,,' a</userinput>
    4.16 +<prompt>$</prompt> <userinput>hg commit -A -m 'Rimosso spazio bianco in coda.'</userinput>
    4.17 +a, riga 2: aggiunto spazio bianco in coda
    4.18 +messaggio di commit salvato nel file .hg/commit.save
    4.19 +transazione abortita!
    4.20 +ripristino completato
    4.21 +fallimento: l'hook pretxncommit.spazio_bianco è terminato con codice di stato 1
    4.22 +</screen>
    4.23 +<!-- END ch09/hook.ws.better -->
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/it/examples/ch09-hook.ws.simple.it	Thu Aug 13 18:57:50 2009 +0200
     5.3 @@ -0,0 +1,14 @@
     5.4 +<!-- BEGIN ch09/hook.ws.simple -->
     5.5 +<screen><prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
     5.6 +[hooks]
     5.7 +pretxncommit.spazio_bianco = hg export tip | (! egrep -q '^\+.*[ \t]$')
     5.8 +<prompt>$</prompt> <userinput>echo 'a ' &gt; a</userinput>
     5.9 +<prompt>$</prompt> <userinput>hg commit -A -m 'Collaudo con spazio bianco in coda.'</userinput>
    5.10 +aggiungo a
    5.11 +transazione abortita!
    5.12 +ripristino completato
    5.13 +fallimento: l'hook pretxncommit.spazio_bianco è terminato con codice di stato 1
    5.14 +<prompt>$</prompt> <userinput>echo 'a' &gt; a</userinput>
    5.15 +<prompt>$</prompt> <userinput>hg commit -A -m 'Elimina lo spazio bianco in coda e riprova.'</userinput>
    5.16 +</screen>
    5.17 +<!-- END ch09/hook.ws.simple -->
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/it/examples/ch10-bugzilla-config.lst.it	Thu Aug 13 18:57:50 2009 +0200
     6.3 @@ -0,0 +1,17 @@
     6.4 +<!-- BEGIN ch10/bugzilla-config.lst -->
     6.5 +<programlisting>[bugzilla]
     6.6 +host = bugzilla.example.com
     6.7 +password = miapassword
     6.8 +version = 2.16
     6.9 +# i repository sul lato server si trovano in /home/hg/repos, quindi devono
    6.10 +# essere eliminati 4 separatori iniziali
    6.11 +strip = 4
    6.12 +hgweb = http://hg.example.com/
    6.13 +usermap = /home/hg/repos/notify/bugzilla.conf
    6.14 +template = Changeset {node|short}, creato da {author} nel repository {webroot}
    6.15 +  fa riferimento a questo bug.\n
    6.16 +  Per i dettagli completi, si veda
    6.17 +  {hgweb}{webroot}?cmd=changeset;node={node|short}\n
    6.18 +  Descrizione del changeset:\n
    6.19 +  \t{desc|tabindent}</programlisting>
    6.20 +<!-- END ch10/bugzilla-config.lst -->
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/it/examples/ch10-notify-config-mail.lst.it	Thu Aug 13 18:57:50 2009 +0200
     7.3 @@ -0,0 +1,20 @@
     7.4 +<!-- BEGIN ch10/notify-config-mail.lst -->
     7.5 +<programlisting>X-Hg-Repo: test/slave
     7.6 +Subject: test/slave: Gestisce l'errore nel caso in cui uno slave non ha alcun master.
     7.7 +Date: Wed,  2 Aug 2006 15:25:46 -0700 (PDT)
     7.8 +
     7.9 +changeset 3cba9bfe74b5 nel repository /home/hg/repos/test/slave
    7.10 +
    7.11 +details:
    7.12 +http://hg.example.com/test/slave?cmd=changeset;node=3cba9bfe74b5 
    7.13 +
    7.14 +description: Gestisce l'errore nel caso in cui uno slave non ha alcun master.
    7.15 +
    7.16 +diffs (54 lines):
    7.17 +diff -r 9d95df7cf2ad -r 3cba9bfe74b5 include/tests.h
    7.18 +--- a/include/tests.h      Wed Aug 02 15:19:52 2006 -0700
    7.19 ++++ b/include/tests.h      Wed Aug 02 15:25:26 2006 -0700
    7.20 +@@ -212,6 +212,15 @@ static __inline__
    7.21 +void test_headers(void *h)
    7.22 +[...omissis...]</programlisting>
    7.23 +<!-- END ch10/notify-config-mail.lst -->
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/it/examples/ch10-notify-config.lst.it	Thu Aug 13 18:57:50 2009 +0200
     8.3 @@ -0,0 +1,21 @@
     8.4 +<!-- BEGIN ch10/notify-config.lst -->
     8.5 +<programlisting>[notify]
     8.6 +# spedisci davvero le email
     8.7 +test = false
     8.8 +# i dati delle sottoscrizioni si trovano nel repository notify
     8.9 +config = /home/hg/repos/notify/notify.conf
    8.10 +# i repository si trovano in /home/hg/repos sul server, quindi
    8.11 +# eliminiamo 4 caratteri "/"
    8.12 +strip = 4
    8.13 +template = X-Hg-Repo: {webroot}\n
    8.14 +  Subject: {webroot}: {desc|firstline|strip}\n
    8.15 +  From: {author}
    8.16 +  \n\n
    8.17 +  changeset {node|short} nel repository {root}
    8.18 +  \n\ndettagli:
    8.19 +  {baseurl}{webroot}?cmd=changeset;node={node|short}
    8.20 +  descrizione: {desc|tabindent|strip}
    8.21 +
    8.22 +[web]
    8.23 +baseurl = http://hg.example.com/</programlisting>
    8.24 +<!-- END ch10/notify-config.lst -->
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/it/examples/hook.msglen.go.it	Thu Aug 13 18:57:50 2009 +0200
     9.3 @@ -0,0 +1,13 @@
     9.4 +<!-- BEGIN hook.msglen.go -->
     9.5 +<screen><prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
     9.6 +[hooks]
     9.7 +pretxncommit.lunghezza_messaggio = test `hg tip --template {desc} | wc -c` -ge 15
     9.8 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
     9.9 +<prompt>$</prompt> <userinput>hg add a</userinput>
    9.10 +<prompt>$</prompt> <userinput>hg commit -A -m 'Troppo breve.'</userinput>
    9.11 +transazione abortita!
    9.12 +ripristino completato
    9.13 +fallimento: l'hook pretxncommit.lunghezza_messaggio è terminato con codice di stato 1
    9.14 +<prompt>$</prompt> <userinput>hg commit -A -m 'Abbastanza lungo.'</userinput>
    9.15 +</screen>
    9.16 +<!-- END hook.msglen.go -->
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/it/examples/hook.simple.ext.it	Thu Aug 13 18:57:50 2009 +0200
    10.3 @@ -0,0 +1,8 @@
    10.4 +<!-- BEGIN hook.simple.ext -->
    10.5 +<screen><prompt>$</prompt> <userinput>echo 'commit.quando = echo -n "data di inserimento: "; date' &gt;&gt; .hg/hgrc</userinput>
    10.6 +<prompt>$</prompt> <userinput>echo a &gt;&gt; a</userinput>
    10.7 +<prompt>$</prompt> <userinput>hg commit -m 'Ho due hook.'</userinput>
    10.8 +inserito c62525b70eac19cfd72060e1654e8c62eab4ebee
    10.9 +data di inserimento: Fri Jun  5 15:50:28 GMT 2009
   10.10 +</screen>
   10.11 +<!-- END hook.simple.ext -->
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/it/examples/hook.simple.init.it	Thu Aug 13 18:57:50 2009 +0200
    11.3 @@ -0,0 +1,14 @@
    11.4 +<!-- BEGIN hook.simple.init -->
    11.5 +<screen><prompt>$</prompt> <userinput>hg init hook-di-test</userinput>
    11.6 +<prompt>$</prompt> <userinput>cd hook-di-test</userinput>
    11.7 +<prompt>$</prompt> <userinput>echo '[hooks]' &gt;&gt; .hg/hgrc</userinput>
    11.8 +<prompt>$</prompt> <userinput>echo 'commit = echo inserito $HG_NODE' &gt;&gt; .hg/hgrc</userinput>
    11.9 +<prompt>$</prompt> <userinput>cat .hg/hgrc</userinput>
   11.10 +[hooks]
   11.11 +commit = echo inserito $HG_NODE
   11.12 +<prompt>$</prompt> <userinput>echo a &gt; a</userinput>
   11.13 +<prompt>$</prompt> <userinput>hg add a</userinput>
   11.14 +<prompt>$</prompt> <userinput>hg commit -m "Collaudo l'hook di commit"</userinput>
   11.15 +inserito 35ce7b98906996dea87740158ba6c3d7bcfa2448
   11.16 +</screen>
   11.17 +<!-- END hook.simple.init -->
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/it/examples/hook.simple.pretxncommit.it	Thu Aug 13 18:57:50 2009 +0200
    12.3 @@ -0,0 +1,16 @@
    12.4 +<!-- BEGIN hook.simple.pretxncommit -->
    12.5 +<screen><prompt>$</prompt> <userinput>cat controlla_bug_id</userinput>
    12.6 +#!/bin/sh
    12.7 +# controlla che un messaggio di commit contenga un identificatore numerico di bug
    12.8 +hg log -r $1 --template {desc} | grep -q "\&lt;bug *[0-9]"
    12.9 +<prompt>$</prompt> <userinput>echo 'pretxncommit.bug_id_richiesto = ./controlla_bug_id $HG_NODE' &gt;&gt; .hg/hgrc</userinput>
   12.10 +<prompt>$</prompt> <userinput>echo a &gt;&gt; a</userinput>
   12.11 +<prompt>$</prompt> <userinput>hg commit -m 'Non ho menzionato alcun identificatore di bug.'</userinput>
   12.12 +transazione abortita!
   12.13 +ripristino completato
   12.14 +fallimento: l'hook pretxncommit.bug_id_richiesto è terminato con codice di stato 1
   12.15 +<prompt>$</prompt> <userinput>hg commit -m 'Vi rimando al bug 666.'</userinput>
   12.16 +inserito f753cb1e1e77ea944429e1a84d8728e96b41446e
   12.17 +data di inserimento: Fri Jun  5 15:50:29 GMT 2009
   12.18 +</screen>
   12.19 +<!-- END hook.simple.pretxncommit -->