# HG changeset patch
# User gpiancastelli
# Date 1250888518 -7200
# Node ID 1856c2f4835ca819c32c348342d94ab7e57dd8bb
# Parent 7252e7b7f07d8794bb9be84c90187330ac97d241
Final editing for chapters 12-14.
diff -r 7252e7b7f07d -r 1856c2f4835c it/ch12-mq.xml
--- a/it/ch12-mq.xml Fri Aug 21 22:29:44 2009 +0200
+++ b/it/ch12-mq.xml Fri Aug 21 23:01:58 2009 +0200
@@ -11,7 +11,7 @@
Il problema di gestione delle patch si presenta in molte situazioni. Probabilmente la più visibile è quella in cui un utente di un progetto software open source fornisce la correzione di un bug o una nuova funzione sotto forma di patch ai manutentori del progetto.
- Chi distribuisce sistemi operativi che includono software open source ha spesso bisogno di effettuare modifiche ai pacchetti che distribuisce in modo da assemblarli correttamente nel proprio ambiente.
+ Chi distribuisce sistemi operativi che includono software open source ha spesso bisogno di effettuare modifiche ai pacchetti distribuiti in modo da assemblarli correttamente nel proprio ambiente.Quando dovete mantenere solo alcune modifiche, potete facilmente gestire una singola patch usando i programmi standard diff e patch (si veda la per una discussione di questi strumenti). Una volta che il numero di modifiche cresce, comincia ad avere senso l'idea di mantenere le patch come frammenti di lavoro distinti in modo che, per esempio, una singola patch contenga solo una correzione di bug (la patch potrebbe modificare diversi file, ma sta facendo solo una cosa) e un certo numero di queste patch sia destinato a bug differenti che dovete correggere e a modifiche locali di cui avete bisogno. In questa situazione, se proponete una patch per la correzione di un bug ai manutentori del pacchetto a monte e questi includono la vostra correzione in una release successiva, potete semplicemente scartare quella singola patch quando state aggiornando il pacchetto a una nuova release.
@@ -177,7 +177,7 @@
&interaction.mq.tutorial.qpop;
- Notate che, dopo aver estratto una patch o due patch, il risultato di qseries rimane lo stesso, mentre quello di qapplied è cambiato.
+ Notate che, dopo aver estratto una patch o due patch, il risultato di qseries è rimasto lo stesso, mentre quello di qapplied è cambiato.
@@ -196,7 +196,7 @@
&interaction.mq.tutorial.add;
- Tutti i comandi che esaminano la directory di lavoro accettano un'opzione so cosa sto facendo che si chiama sempre . L'esatto significato di dipende dal comando. Per esempio, hg qnew incorporerà i cambiamenti in sospeso nella nuova patch creata, ma hg qpop annullerà le modifiche a qualsiasi file coinvolto dalla patch che sta estraendo. Assicuratevi di leggere la documentazione per l'opzione di un comando prima di usarla!
+ Tutti i comandi che esaminano la directory di lavoro accettano un'opzione so cosa sto facendo che si chiama sempre . L'esatto significato di dipende dal comando. Per esempio, hg qnew -f incorporerà i cambiamenti in sospeso nella nuova patch creata, ma hg qpop -f annullerà le modifiche a qualsiasi file coinvolto dalla patch che sta estraendo. Assicuratevi di leggere la documentazione per l'opzione di un comando prima di usarla!
@@ -204,7 +204,7 @@
Il comando qrefresh aggiorna sempre la patch applicata più recentemente. Questo significa che potete sospendere il lavoro su una patch (aggiornandola), operare estrazioni o inserimenti in modo che l'ultima patch applicata sia differente e lavorare su questa patch per un po'.
- Ecco un esempio che illustra come potete sfruttare questa possibilità. Diciamo che state sviluppando una nuova funzione sotto forma di due patch. La prima è una modifica al nucleo del vostro software e la seconda&emdash;basata sulla prima&emdash;modifica l'interfaccia utente per usare il codice che avete appena aggiunto al nucleo. Se notate un bug nel nucleo mentre state lavorando sulla patch per l'interfaccia utente, per correggerlo vi basta usare qrefresh, in modo da salvare le modifiche in corso alla vostra patch di interfaccia, e poi usare qpop per estrarre la patch del nucleo. Correggete il bug nel nucleo, aggiornate la patch del nucleo con qrefresh e inserite la patch di interfaccia tramite qpush per continuare a lavorare dal punto dove avevate lasciato.
+ Ecco un esempio che illustra come potete sfruttare questa possibilità. Diciamo che state sviluppando una nuova funzione sotto forma di due patch. La prima è una modifica al nucleo del vostro software e la seconda&emdash;basata sulla prima&emdash;modifica l'interfaccia utente per usare il codice che avete appena aggiunto al nucleo. Se notate un bug nel nucleo mentre state lavorando sulla patch per l'interfaccia utente, per correggerlo vi basta usare qrefresh, in modo da salvare le modifiche in corso alla vostra patch di interfaccia, e poi usare qpop per poter operare sulla patch del nucleo. Correggete il bug nel nucleo, aggiornate la patch del nucleo con qrefresh e inserite la patch di interfaccia tramite qpush per continuare a lavorare dal punto dove avevate lasciato.
@@ -267,7 +267,7 @@
Anche se l'applicazione di un blocco con un certo scostamento o con un certo fattore di incertezza avrà spesso un successo completo, queste tecniche inesatte lasciano naturalmente aperta la possibilità di rovinare il file modificato. Il caso più comune è tipicamente quello in cui la patch viene applicata due volte o in una posizione sbagliata nel file. Se patch o qpush dovessero mai menzionare lo scostamento o il fattore di incertezza, dovreste assicurarvi che i file siano stati modificati in maniera corretta.
- Spesso è una buona idea aggiornare una patch che è stata applicata con uno scostamento o un fattore di incertezza, perché l'aggiornamento della patch genera nuove informazioni di contesto che permetteranno di applicarla in maniera pulita. Dico spesso, non sempre, perché qualche volta l'aggiornamento di una patch ne renderà impossibile l'applicazione su una revisione differente dei file coinvolti. In alcuni casi, come quando state mantenendo una patch che deve essere applicabile a molteplici versioni di un albero di sorgenti, è considerato accettabile avere una patch che si applica con qualche incertezza, purché abbiate verificato i risultati del processo di applicazione in casi come questi.
+ Spesso è una buona idea aggiornare una patch che è stata applicata con uno scostamento o un fattore di incertezza, perché l'aggiornamento della patch genera nuove informazioni di contesto che permetteranno di applicarla in maniera precisa. Dico spesso, non sempre, perché qualche volta l'aggiornamento di una patch ne renderà impossibile l'applicazione su una revisione differente dei file coinvolti. In alcuni casi, come quando state mantenendo una patch che deve essere applicabile a molteplici versioni di un albero di sorgenti, è considerato accettabile avere una patch che si applica con qualche incertezza, purché abbiate verificato i risultati del processo di applicazione in casi come questi.
@@ -331,11 +331,11 @@
MQ è molto efficiente nel gestire un grande numero di patch. Ho effettuato alcuni esperimenti sulle prestazioni a metà del 2006 per una presentazione che ho tenuto alla conferenza EuroPython 2006 (su macchine più moderne, dovreste aspettarvi risultati migliori di quelli che vedrete nel seguito). Come dati campione ho usato la serie di patch 2.6.17-mm1 per il kernel di Linux, contenente 1.738 patch. Ho applicato queste patch a un repository del kernel di Linux contenente tutte le 27.472 revisioni intercorse tra Linux 2.6.12-rc2 e Linux 2.6.17.
- Sul mio vecchio e lento portatile, sono riuscito a eseguire hg qpush per tutte le 1.738 patch in 3.5 minuti e a eseguire hg qpop per tutte le patch in 30 secondi. (Su portatili più recenti, il tempo per estrarre tutte le patch è sceso a due minuti.) Ho potuto aggiornare una delle patch più grandi (che ha effettuato 22.779 righe di cambiamenti a 287 file) eseguendo qrefresh in 6.6 secondi.
+ Sul mio vecchio e lento portatile, sono riuscito a eseguire hg qpush -a per tutte le 1.738 patch in 3.5 minuti e a eseguire hg qpop -a per tutte le patch in 30 secondi. (Su portatili più recenti, il tempo per estrarre tutte le patch è sceso a due minuti.) Ho potuto aggiornare una delle patch più grandi (che ha effettuato 22.779 righe di cambiamenti a 287 file) eseguendo qrefresh in 6.6 secondi.Chiaramente, MQ è particolarmente adatto per lavorare su alberi di grandi dimensioni, ma ci sono alcuni trucchi che potete usare per ottenere prestazioni ancora migliori.
- Prima di tutto, provate a raggruppare insieme le operazioni. Ogni volta che eseguite qpush o qpop, questi comandi esaminano la directory di lavoro una volta per assicurarsi che non abbiate effettuato alcuna modifica dimenticandovi poi di invocare qrefresh. Su alberi di piccole dimensioni, il tempo impiegato da questa disamina è insignificante. Tuttavia, su un albero di medie dimensioni (contenente decine di migliaia di file), questa operazione può impiegare anche più di un secondo.
+ Prima di tutto, provate a raggruppare insieme le operazioni. Quando eseguite qpush o qpop, questi comandi esaminano la directory di lavoro una volta per assicurarsi che non abbiate effettuato alcuna modifica dimenticandovi poi di invocare qrefresh. Su alberi di piccole dimensioni, il tempo impiegato da questa disamina è insignificante. Tuttavia, su un albero di medie dimensioni (contenente decine di migliaia di file), questa operazione può impiegare anche più di un secondo.I comandi qpush e qpop vi permettono di estrarre e inserire più patch alla volta. Come prima cosa, identificate la patch di destinazione che volete raggiungere. Quando usate qpush specificando una destinazione, il comando inserirà patch finché quella patch non si troverà in cima alla pila delle patch applicate. Quando usate qpop con una destinazione, MQ estrarrà patch finché la patch di destinazione non si troverà in cima a quella pila.
@@ -347,7 +347,7 @@
Capita spesso di mantenere una pila di patch su un repository sottostante che non modificate direttamente. Se state lavorando sui cambiamenti a codice di terze parti, o su una funzione che impiegate più tempo a sviluppare rispetto alla velocità di cambiamento del codice su cui si basa, avrete spesso bisogno di sincronizzarvi con il codice sottostante e di correggere ogni blocco delle vostre patch che non è più applicabile. Questa operazione si chiama rifondare la vostra serie di patch.
- Il modo più semplice per eseguire questa operazione è quello di usare hg qpop per estrarre le vostre patch, poi invocare hg pull per propagare i cambiamenti nel repository sottostante e infine eseguire hg qpush per inserire nuovamente le vostre patch. MQ interromperà l'inserimento ogni volta che incontra una patch che non riesce ad applicare a causa di qualche conflitto, dandovi la possibilità di risolvere i conflitti, aggiornare la patch interessata tramite qrefresh e continuare a inserire fino a quando non avrete corretto l'intera pila.
+ Il modo più semplice per eseguire questa operazione è quello di usare hg qpop -a per estrarre le vostre patch, poi invocare hg pull per propagare i cambiamenti nel repository sottostante e infine eseguire hg qpush -a per inserire nuovamente le vostre patch. MQ interromperà l'inserimento ogni volta che incontra una patch che non riesce ad applicare a causa di qualche conflitto, dandovi la possibilità di risolvere i conflitti, aggiornare la patch interessata tramite qrefresh e continuare a inserire fino a quando non avrete corretto l'intera pila.Questo approccio è semplice e funziona bene se non vi aspettate che le modifiche al codice sottostante influenzino l'applicabilità delle vostre patch. Tuttavia, se la vostra pila di patch coinvolge codice che viene modificato in maniera frequente o invasiva nel repository sottostante, correggere a mano i blocchi rifiutati diventa velocemente una seccatura.
@@ -357,16 +357,16 @@
Come prima cosa, invocate hg qpush -a per inserire tutte le vostre patch sulla revisione su cui sapete che si applicano in maniera pulita.
- Salvate una copia di backup della vostra directory delle patch usando hg qsave . Questo comando salva le patch in una directory chiamata .hg/patches.N, dove N è un piccolo intero, e stampa il nome della directory in cui sono state salvate le patch. Il comando inserisce anche un changeset di salvataggio dopo quelli corrispondenti alle vostre patch applicate, per registrare internamente gli stati dei file series e status.
+ Salvate una copia di backup della vostra directory delle patch usando hg qsave -e -c. Questo comando salva le patch in una directory chiamata .hg/patches.N, dove N è un piccolo intero, e stampa il nome della directory in cui sono state salvate le patch. Il comando inserisce anche un changeset di salvataggio dopo quelli corrispondenti alle vostre patch applicate, per registrare internamente gli stati dei file series e status.Invocate hg pull per propagare i nuovi cambiamenti nel repository sottostante. (Non usate hg pull -u, perché l'aggiornamento dovrà essere fatto in maniera particolare, come vedrete nel prossimo punto.)
- Aggiornate la directory di lavoro alla nuova revisione di punta, usando hg update per sovrascrivere le modifiche apportate dalle patch che avete inserito.
+ Aggiornate la directory di lavoro alla nuova revisione di punta, usando hg update -C per sovrascrivere le modifiche apportate dalle patch che avete inserito.Unite tutte le patch usando hg qpush -m -a. L'opzione di qpush dice a MQ di effettuare un'unione a tre vie se l'applicazione di una patch fallisce.
- Durante l'esecuzione di hg qpush , ogni patch nel file series viene applicata normalmente. Se una patch viene applicata con un fattore di incertezza o viene rifiutata, MQ esamina la coda che avete salvato tramite qsave ed effettua un'unione a tre vie con il changeset che corrisponde alla patch. Questa operazione sfrutta il normale meccanismo di unione di Mercurial, quindi potrebbe aprire uno strumento grafico di unione in modo da aiutarvi a risolvere i problemi.
+ Durante l'esecuzione di hg qpush -m, ogni patch nel file series viene applicata normalmente. Se una patch viene applicata con un fattore di incertezza o viene rifiutata, MQ esamina la coda che avete salvato tramite qsave ed effettua un'unione a tre vie con il changeset che corrisponde alla patch. Questa operazione sfrutta il normale meccanismo di unione di Mercurial, quindi potrebbe aprire uno strumento grafico di unione in modo da aiutarvi a risolvere i problemi.Quando avete finito di risolvere gli effetti di una patch, MQ aggiornerà la vostra patch sulla base dei risultati dell'unione.
@@ -420,7 +420,7 @@
Dato che la directory .hg/patches di MQ risiede fuori dalla directory di lavoro di un repository Mercurial, il repository Mercurial sottostante non sa nulla della gestione o della presenza delle patch.
- Questo presenta l'interessante possibilità di gestire i contenuti della directory delle patch come un repository Mercurial indipendente. Questo può essere un modo utile per lavorare. Per esempio, potete lavorare su una patch per un po', aggiornala tramite qrefresh, poi usare hg commit per registrare lo stato corrente della patch. Questo vi permette di ritornare a quella versione della patch più tardi.
+ Questo presenta l'interessante possibilità di gestire i contenuti della directory delle patch come un repository Mercurial indipendente. Questo può essere un modo utile per lavorare. Per esempio, potete lavorare su una patch per un po', aggiornarla tramite qrefresh, poi usare hg commit per registrare lo stato corrente della patch. Questo vi permette di ritornare a quella versione della patch più tardi.Potete quindi condividere differenti versioni della stessa pila di patch tra molteplici repository sottostanti. Uso questa tecnica quando sto sviluppando una funzione del kernel di Linux. Ho una copia intatta dei miei sorgenti del kernel per ogni diversa architettura di CPU e un repository clonato su ognuna di queste architetture che contiene le patch su cui sto lavorando. Quando voglio collaudare una modifica su un'architettura differente, trasmetto le mie patch correnti al repository associato con il kernel di quell'architettura, estraggo e inserisco tutte le mie patch, infine assemblo e collaudo quel kernel.
@@ -432,7 +432,7 @@
MQ vi aiuta a lavorare con la directory .hg/patches in qualità di repository. Quando preparate un repository per lavorare con le patch usando qinit, potete passare l'opzione per creare la directory .hg/patches sotto forma di repository Mercurial.
- Se dimenticate di usare l'opzione , potete semplicemente posizionarvi nella directory .hg/patches in qualsiasi momento e invocare hg init. Non dimenticate, però, di aggiungere una voce per il file status al file .hgignore (hg qinit lo fa automaticamente per voi), perché il file status non andrebbe davvero amministrato.
+ Se dimenticate di usare l'opzione , potete semplicemente posizionarvi nella directory .hg/patches in qualsiasi momento e invocare hg init. Non dimenticate, però, di aggiungere una voce per il file status al file .hgignore (hg qinit -c lo fa automaticamente per voi), perché il file status non andrebbe davvero amministrato.Per convenienza, se MQ nota che la directory .hg/patches è un repository, userà automaticamente hg add per aggiungere ogni patch che create e importate.
@@ -451,7 +451,7 @@
Il supporto di MQ per lavorare con un repository pieno di patch è limitato in alcuni aspetti di dettaglio.
- MQ non può automaticamente scoprire quali modifiche avete fatto alla directory delle patch. Se usate hg pull, apportate cambiamenti a mano, o invocate hg update per aggiornare le modifiche alle patch o al file series, dovrete usare hg qpop e poi hg qpush nel repository sottostante per fare in modo che quelle modifiche compaiano anche là. Se dimenticate di fare questo, potreste confondere le idee a MQ in merito a quali patch sono state effettivamente applicate.
+ MQ non può automaticamente scoprire quali modifiche avete fatto alla directory delle patch. Se usate hg pull, apportate cambiamenti a mano, o invocate hg update per aggiornare le modifiche alle patch o al file series, dovrete usare hg qpop -a e poi hg qpush -a nel repository sottostante per fare in modo che quelle modifiche compaiano anche là. Se dimenticate di fare questo, potreste confondere le idee a MQ in merito a quali patch sono state effettivamente applicate.
@@ -470,11 +470,11 @@
Strategie valide per lavorare con le patch
- Sia che stiate lavorando su una serie di patch da sottoporre a un progetto software libero od open source, o su una serie che intendete trattare come una sequenza di normali changeset una volta che avete finito, potete usare alcune semplici tecniche per mantenere bene organizzato il vostro lavoro.
+ Sia che stiate lavorando su una serie di patch da sottoporre a un progetto software libero od open source, oppure su una serie che intendete trattare come una sequenza di normali changeset una volta che avete finito, potete usare alcune semplici tecniche per mantenere bene organizzato il vostro lavoro.Date nomi descrittivi alle vostre patch. Un buon nome per una patch potrebbe essere riorganizza-allocazione-dispositivi.patch, perché vi suggerirà immediatamente qual è lo scopo della patch. I nomi lunghi non dovrebbero essere un problema: non digiterete i nomi spesso, ma invocherete comandi come qapplied e qtop più e più volte. Una buona denominazione diventa particolarmente importante quando state lavorando con un certo numero di patch, o se vi state destreggiando tra un certo numero di attività differenti e le vostre patch ottengono solo una frazione della vostra attenzione.
- Siate consapevoli della patch su cui state lavorando. Usate frequentemente il comando qtop e date un'occhiata al testo delle vostre patch&emdash;per esempio, usando hg tip &emdash;per assicurarvi di sapere dove vi trovate. Mi è capitato molte volte di modificare e aggiornare una patch diversa da quella che intendevo, ed è spesso complicato trasferire le modifiche nella patch giusta dopo averle inserite in quella sbagliata.
+ Siate consapevoli della patch su cui state lavorando. Usate frequentemente il comando qtop e date un'occhiata al testo delle vostre patch&emdash;per esempio, usando hg tip -p&emdash;per assicurarvi di sapere dove vi trovate. Mi è capitato molte volte di modificare e aggiornare una patch diversa da quella che intendevo, ed è spesso complicato trasferire le modifiche nella patch giusta dopo averle inserite in quella sbagliata.Per questo motivo, vale davvero la pena di investire un po' di tempo per imparare a usare alcuni degli strumenti di terze parti che ho descritto nella , in particolare diffstat e filterdiff. Il primo vi darà velocemente un'idea di quali sono le modifiche effettuate dalla vostra patch, mentre il secondo vi renderà più facile selezionare blocchi particolari di una patch e inserirli in un'altra.
@@ -529,7 +529,7 @@
(nella prima colonna) un numero di file per identificare ogni file modificato dalla patch;
- (sulla riga seguente, indentato) il numero di riga del file modificato dove comincia il blocco; e
+ (sulla riga seguente, indentato) il numero di riga del file modificato dove comincia il blocco;(sulla stessa riga) un numero di blocco per identificare quel blocco.
diff -r 7252e7b7f07d -r 1856c2f4835c it/ch13-mq-collab.xml
--- a/it/ch13-mq-collab.xml Fri Aug 21 22:29:44 2009 +0200
+++ b/it/ch13-mq-collab.xml Fri Aug 21 23:01:58 2009 +0200
@@ -6,10 +6,10 @@
In questo capitolo, userò come esempio una tecnica che ho impiegato per gestire lo sviluppo di un driver del kernel di Linux per un dispositivo Infiniband. Il driver in questione è grande (almeno per le dimensioni dei driver), poiché contiene 25.000 righe di codice distribuite su 35 file sorgente, e viene mantenuto da un piccolo gruppo di sviluppatori.
- Sebbene la maggior parte del materiale in questo capitolo sia specifica per Linux, gli stessi principi si applicano per qualsiasi base di codice di cui non siate i proprietari principali e su cui dobbiate fare parecchio lavoro.
-
-
- Il problema dei molti obiettivi
+ Sebbene la maggior parte del materiale in questo capitolo sia specifica per Linux, gli stessi principi si applicano nel caso in cui dobbiate fare parecchio lavoro su una qualsiasi base di codice di cui non siete i proprietari principali.
+
+
+ Il problema di gestire molti obiettiviIl kernel di Linux cambia rapidamente e non è mai stato stabile internamente, in quanto gli sviluppatori effettuano frequentemente modifiche drastiche tra una release e l'altra. Questo significa che, di solito, una versione del driver che funziona bene con una particolare versione rilasciata del kernel non potrà nemmeno essere compilata correttamente su qualsiasi altra versione del kernel.
@@ -17,9 +17,9 @@
Un obiettivo è l'albero di sviluppo principale del kernel di Linux. In questo caso, le attività di manutenzione del codice sono parzialmente condivise con altri sviluppatori della comunità del kernel, che effettuano modifiche estemporanee al driver man mano che sviluppano e rifiniscono i sottosistemi del kernel.
- Manteniamo anche un certo numero di backport (letteralmente, conversioni all'indietro) verso vecchie versioni del kernel di Linux, per soddisfare le necessità di clienti che stanno utilizzando distribuzioni di Linux più vecchie che non incorporano i nostri driver. (Effetuare il backport del codice significa modificarlo per farlo funzionare in una versione del suo ambiente di destinazione più vecchia di quella per la quale era stato sviluppato.)
-
- Infine, rilasciamo il software seguendo una tabella di marcia che non è necessariamente allineata con quella usata da chi sviluppa il kernel e da chi distribuisce il sistema operativo, in modo da poter consegnare nuove funzionalità ai clienti senza obbligarli ad aggiornare il loro kernel o la loro intera distribuzione.
+ Manteniamo anche un certo numero di backport (letteralmente, conversioni all'indietro) verso vecchie versioni del kernel di Linux, per soddisfare le necessità di clienti che stanno utilizzando distribuzioni di Linux più vecchie che non incorporano i nostri driver. (Effettuare il backport del codice significa modificarlo per farlo funzionare in una versione del suo ambiente di destinazione più vecchia di quella per la quale era stato sviluppato.)
+
+ Infine, rilasciamo il software seguendo una tabella di marcia che non è necessariamente allineata con quella usata da chi sviluppa il kernel e da chi distribuisce il sistema operativo, in modo da poter consegnare nuove funzioni ai clienti senza obbligarli ad aggiornare il loro kernel o la loro intera distribuzione.
@@ -28,7 +28,7 @@
Ci sono due modi standard per mantenere un software che deve funzionare in molti ambienti diversi.
- Il primo è mantenere un certo numero di rami, ognuno dedicato a un singolo ambiente. Il problema di questo approccio è che dovete mantenere una ferrea disciplina nel flusso dei cambiamenti tra i repository. Una nuova funzione o correzione di bug deve prendere vita in un repository intatto, poi passare a tutti i repository di backport. Le modifiche di backport dovrebbero propagarsi verso un numero di rami più limitato, in quanto l'applicazione di una modifica di backport su un ramo a cui non appartiene probabilmente impedirà al driver di essere compilato.
+ Il primo è mantenere un certo numero di rami, ognuno dedicato a un singolo obiettivo. Il problema di questo approccio è che dovete mantenere una ferrea disciplina nel flusso dei cambiamenti tra i repository. Una nuova funzione o correzione di bug deve prendere vita in un repository intatto, poi passare a tutti i repository di backport. Le modifiche di backport dovrebbero propagarsi verso un numero di rami più limitato, in quanto l'applicazione di una modifica di backport su un ramo a cui non appartiene probabilmente impedirà al driver di essere compilato.Il secondo è quello di mantenere un singolo albero di sorgenti pieno di istruzioni condizionali che attivano o disattivano parti di codice a seconda dell'ambiente designato. Dato che queste istruzioni ifdef non sono permesse nell'albero del kernel di Linux, è necessario seguire una procedura manuale o automatica per eliminarle e produrre un albero pulito. Una base di codice mantenuta in questo modo diventa rapidamente un caos di blocchi condizionali che sono difficili da capire e mantenere.
@@ -135,7 +135,7 @@
Poi scelgo una versione di base sulla quale le patch vengono applicate. Questa è una fotografia dell'albero del kernel di Linux scattata su una revisione di mia scelta. Quando scatto la fotografia, registro l'identificatore di changeset proveniente dal repository del kernel nel messaggio di commit. Dato che la fotografia mantiene la forma e il contenuto delle parti rilevanti dell'albero del kernel, posso applicare le mie patch sul mio repository ridotto o su un normale albero del kernel.
- Normalmente, l'albero di base a cui applicare le patch dovrebbe essere una fotografia di un albero a monte molto recente. Questa è la condizione migliore per facilitare lo sviluppo di patch che possono essere presentate a monte con poche o addirittura nessuna modifica.
+ Normalmente, l'albero di base su cui applicare le patch dovrebbe essere una fotografia di un albero a monte molto recente. Questa è la condizione migliore per facilitare lo sviluppo di patch che possono essere presentate a monte con poche o addirittura nessuna modifica.
@@ -172,7 +172,7 @@
Nel mio lavoro, uso un certo numero di guardie per controllare quali patch devono essere applicate.
- Le patch accettate sono sorvegliate da accettate. Questa guardia è abilitata per la maggior parte del tempo. Quando sto applicando le patch su un albero dove le patch sono già presenti, posso disabilitare questa guardia così le patch che la seguono verranno applicate in maniera pulita.
+ Le patch accettate sono sorvegliate da accettate. Questa guardia è abilitata per la maggior parte del tempo. Quando sto applicando le patch su un albero dove sono già presenti, posso disabilitare questa guardia così le patch che la seguono verranno applicate in maniera pulita.Le patch che sono terminate, ma non sono ancora state proposte, non hanno guardie. Se sto applicando la pila delle patch a una copia dell'albero a monte, non ho bisogno di abilitare alcuna guardia per ottenere un albero di sorgenti ragionevolmente sicuro.
@@ -202,7 +202,7 @@
Organizzare le patch in directory
- Se state lavorando su un progetto considerevole con MQ, non è difficile accumulare un grande numero di patch. Per esempio, mi è capitato di avere un repository di patch contenente più di 250 patch.
+ Se state lavorando su un progetto di dimensioni considerevoli con MQ, non è difficile accumulare un grande numero di patch. Per esempio, mi è capitato di avere un repository di patch contenente più di 250 patch.Se riuscite a raggruppare queste patch in categorie logiche separate, potete memorizzarle in directory differenti, in quanto MQ non ha problemi a usare nomi di patch che contengono separatori di percorso.
@@ -210,14 +210,14 @@
Visualizzare la cronologia di una patch
- Se sviluppate un insieme di patch per un lungo periodo, è una buona idea mantenerle in un repository, come discusso nella . Se fate in questo modo, scoprirete velocemente che è impraticabile usare il comando hg diff per esaminare la cronolgia dei cambiamenti di una patch. In parte, questo succede perché state osservando la derivata seconda del codice reale (un diff di un diff), ma anche perché MQ aggiunge rumore al processo modificando le marcature temporali e i nomi di directory quando aggiorna una patch.
-
- Tuttavia, potete usare l'estensione extdiff inclusa in Mercurial per rendere leggibile il diff di due versioni di una patch. Per fare questo, avrete bisogno di un pacchetto di terze parti chiamato patchutils. Il pacchetto fornisce un comando chiamato interdiff che mostra le differenze tra due diff di un diff. Usato su due versioni dello stesso diff, genera un diff che rappresenta le differenze tra la prima e la seconda versione.
+ Se sviluppate un insieme di patch per un lungo periodo, è una buona idea mantenerle in un repository, come discusso nella . Se fate in questo modo, scoprirete velocemente che è impraticabile usare il comando hg diff per esaminare la cronologia dei cambiamenti di una patch. In parte, questo succede perché state osservando la derivata seconda del codice reale (un diff di un diff), ma anche perché MQ aggiunge rumore al processo modificando le marcature temporali e i nomi di directory quando aggiorna una patch.
+
+ Tuttavia, potete usare l'estensione extdiff inclusa in Mercurial per rendere leggibile il diff di due versioni di una patch. Per fare questo, avrete bisogno di un pacchetto di terze parti chiamato patchutils. Il pacchetto fornisce un comando chiamato interdiff che mostra le differenze tra due diff come un diff. Usato su due versioni dello stesso diff, genera un diff che rappresenta le differenze tra la prima e la seconda versione.Potete abilitare l'estensione extdiff nel solito modo, aggiungendo una riga alla sezione extensions del vostro file ~/.hgrc.[extensions]
extdiff =
- Il comando interdiff si aspetta che gli vengano passati i nomi di due file, ma l'estensione extdiff passa una coppia di directory al programma che invoca, ognuna delle quali può contenere un numero arbitrario di file. Quindi abbiamo bisogno di un piccolo programma che invochi interdiff su ogni coppia di file in quelle due directory. Questo programma è disponibile sotto il nome di hg-interdiff nella directory examples del repository di codice sorgente che accompagna questo libro.FIXME Where in the world is the file in that repository?
+ Il comando interdiff si aspetta che gli vengano passati i nomi di due file, ma l'estensione extdiff passa una coppia di directory al programma che invoca, ognuna delle quali può contenere un numero arbitrario di file. Quindi abbiamo bisogno di un piccolo programma che invochi interdiff su ogni coppia di file in quelle due directory. Questo programma è disponibile sotto il nome di hg-interdiff nella directory contrib del repository di codice sorgente che accompagna questo libro.[NdT] Potete scaricare il programma hg-interdiff dal repository Mercurial del libro ospitato su Bitbucket.Dopo aver incluso il programma hg-interdiff nel percorso di ricerca della vostra shell, potete eseguirlo come segue, dall'interno di una directory di patch gestita da MQ:hg extdiff -p hg-interdiff -r A:B mio-cambiamento.patch
diff -r 7252e7b7f07d -r 1856c2f4835c it/ch14-hgext.xml
--- a/it/ch14-hgext.xml Fri Aug 21 22:29:44 2009 +0200
+++ b/it/ch14-hgext.xml Fri Aug 21 23:01:58 2009 +0200
@@ -15,10 +15,12 @@
In questo capitolo, parleremo di alcune delle altre estensioni disponibili per Mercurial e tratteremo brevemente alcuni dei meccanismi che avrete bisogno di conoscere se volete scrivere le vostre estensioni.
+
Migliorare le prestazioni con l'estensione inotify
@@ -33,7 +35,7 @@
Molti sistemi operativi moderni contengono utilità di notifica per i file. Se un programma si registra al servizio appropriato, il sistema operativo lo avvertirà ogni volta che un file di interesse viene creato, modificato, o cancellato. Sui sistemi Linux, il componente del kernel che si occupa di questa funzione si chiama inotify.
- L'estensione inotify di Mercurial interagisce con il componente inotify per ottimizzare l'esecuzione di hg status. Questa estensione ha due componenti. Un demone viene eseguito in background e riceve le notifiche dal sottosistema inotify, accettando connessioni anche dai normali comandi Mercurial. L'estensione modifica il comportamento di Mercurial in modo che, invece di esaminare il file system, interroghi il demone. Dato che il demone possiede informazioni esatte sullo stato del repository, può rispondere istantaneamente con un risultato, evitando il bisogno di esaminare tutti i file e le directory nel repository.
+ L'estensione inotify di Mercurial interagisce con il componente inotify per ottimizzare l'esecuzione di hg status. Questa estensione ha due componenti. Un demone viene eseguito in background e riceve le notifiche dal sottosistema inotify, accettando connessioni anche dai normali comandi Mercurial. L'estensione modifica il comportamento di Mercurial in modo che, invece di esaminare il file system, interroghi il demone. Dato che il demone possiede informazioni esatte sullo stato del repository, può rispondere istantaneamente con un risultato, senza dover esaminare tutti i file e le directory nel repository.Ricordate i dieci secondi che ho misurato come il tempo impiegato dal solo Mercurial per eseguire hg status su un repository di 150.000 file? Con l'estensione inotify abilitata, il tempo è sceso a 0.1 secondi, più veloce di un fattore cento.
@@ -46,7 +48,7 @@
Non tutti i file system sono adatti per essere usati con l'estensione inotify. I file system di rete come NFS sono fuori gioco, per esempio, in particolare se state eseguendo Mercurial su diversi sistemi che montano lo stesso file system di rete. Il sistema inotify del kernel non ha alcun modo di sapere quali cambiamenti sono avvenuti su un altro sistema. La maggior parte dei file system locali (e.g. ext3, XFS, ReiserFS) dovrebbe andare bene.
- A maggio 2007, l'estensione inotify non viene ancora distribuita con Mercurial, quindi è un po' più complicata da installare rispetto ad altre estensioni. Ma il miglioramento delle prestazioni ne vale la pena!
+ A maggio 2007,FIXME The inotify extension is bundled with Mercurial since Mercurial 1.0! l'estensione inotify non viene ancora distribuita con Mercurial, quindi è un po' più complicata da installare rispetto ad altre estensioni. Ma il miglioramento delle prestazioni ne vale la pena!Attualmente, l'estensione è divisa in due parti: un insieme di patch al codice sorgente di Mercurial e una libreria di interfaccia Python al sottosistema inotify.
@@ -164,7 +166,7 @@
Grazie alla sua estensione patchbomb, Mercurial facilita l'invio di email contenenti modifiche da rivedere o applicare. L'estensione è chiamata così perché le modifiche vengono inviate in forma di patch e solitamente viene inviato un singolo changeset per ogni messaggio email. Quindi, inviare una lunga serie di cambiamenti via email è molto simile a bombardare la casella del ricevente, da cui il nome patchbomb.
- Come al solito, la configurazione di base dell'estensione patchbomb occupa solo una o due righe del vostro file /.hgrc.
+ Come al solito, la configurazione di base dell'estensione patchbomb occupa solo una o due righe del vostro file ~/.hgrc.[extensions]
patchbomb =Una volta che avete abilitato l'estensione, avrete a disposizione un nuovo comando chiamato email.
@@ -186,9 +188,9 @@
Non tutti i progetti hanno esattamente le stesse convenzioni per spedire cambiamenti via email, così l'estensione patchbomb prova a fornire un certo numero di variazioni attraverso le opzioni a riga di comando.
- Potete scrivere un oggetto per il messaggio introduttivo sulla riga di comando usando l'opzione . Questa opzione accetta un argomento, il testo da usare per l'oggetto.
-
- Per cambiare l'indirizzo email da cui vengono spediti i messaggi usate l'opzione . Questa opzione accetta un argomento, l'indirizzo email da usare.
+ Potete scrivere un oggetto per il messaggio introduttivo sulla riga di comando usando l'opzione . Questa opzione accetta come argomento il testo da usare per l'oggetto.
+
+ Per cambiare l'indirizzo email da cui vengono spediti i messaggi usate l'opzione . Questa opzione accetta come argomento l'indirizzo email da usare.Il comportamento predefinito è quello di inviare diff unificati (leggete la per una descrizione del formato), uno per ogni messaggio. Potete invece usare l'opzione per inviare un bundle eseguibile.
@@ -196,7 +198,7 @@
I diff vengono normalmente spediti in linea, nella stessa parte del corpo che contiene la descrizione della patch. Questo è il modo più facile per consentire al più ampio numero di lettori di rispondere citando parti di un diff, dato che alcuni client email citeranno soltanto la prima parte MIME del corpo di un messaggio. Se preferite inviare la descrizione e il diff in parti separate del corpo, usate l'opzione .
- Invece di spedire messaggi email, potete salvarli in una cartella email in formato mbox usando l'opzione . Questa opzione accetta un argomento, il nome del file su cui scrivere.
+ Invece di spedire messaggi email, potete salvarli in una cartella email in formato mbox usando l'opzione . Questa opzione accetta come argomento il nome del file su cui scrivere.Se preferite aggiungere un riepilogo nel formato del comando diffstat a ogni patch e uno al messaggio introduttivo, usate l'opzione . Il comando diffstat mostra una tabella contenente il nome di ogni file coinvolto nella patch, il numero di righe modificate e un istogramma che illustra quante modifiche sono state apportate a ogni file. Questo riepilogo offre a chi legge una visione qualitativa della complessità di una patch.
diff -r 7252e7b7f07d -r 1856c2f4835c it/examples/mq.id.output.it
--- a/it/examples/mq.id.output.it Fri Aug 21 22:29:44 2009 +0200
+++ b/it/examples/mq.id.output.it Fri Aug 21 23:01:58 2009 +0200
@@ -4,19 +4,19 @@
seconda.patch
$hg log -r qbase:qtip
changeset: 1:32b3cae9e753
-tag: prima.patch
-tag: qbase
-user: Bryan O'Sullivan <bos@serpentine.com>
-date: Fri Jun 05 15:50:45 2009 +0000
-summary: [mq]: prima.patch
+etichetta: prima.patch
+etichetta: qbase
+utente: Bryan O'Sullivan <bos@serpentine.com>
+data: Fri Jun 05 15:50:45 2009 +0000
+sommario: [mq]: prima.patch
changeset: 2:dee839d89dc6
-tag: qtip
-tag: seconda.patch
-tag: tip
-user: Bryan O'Sullivan <bos@serpentine.com>
-date: Fri Jun 05 15:50:46 2009 +0000
-summary: [mq]: seconda.patch
+etichetta: qtip
+etichetta: seconda.patch
+etichetta: tip
+utente: Bryan O'Sullivan <bos@serpentine.com>
+data: Fri Jun 05 15:50:46 2009 +0000
+sommario: [mq]: seconda.patch
$hg export seconda.patch
# HG changeset di patch
diff -r 7252e7b7f07d -r 1856c2f4835c it/examples/mq.qinit-help.help.it
--- a/it/examples/mq.qinit-help.help.it Fri Aug 21 22:29:44 2009 +0200
+++ b/it/examples/mq.qinit-help.help.it Fri Aug 21 23:01:58 2009 +0200
@@ -4,12 +4,12 @@
inizializza un nuovo repository di coda
- Per default, il repository di coda non è sotto controllo di
- versione. Se viene specificato -c, qinit creerà un repository
- annidato separato per le patch (qinit -c può anche essere
- invocato più tardi per convertire un repository di patch non
- gestito in uno gestito). Potete usare qcommit per inserire
- modifiche in questo repository di coda.
+ Per default, il repository di coda non è sotto controllo
+ di revisione. Se viene specificato -c, qinit creerà un
+ repository annidato separato per le patch (qinit -c può
+ anche essere invocato più tardi per convertire un repository
+ di patch non gestito in uno gestito). Potete usare qcommit
+ per inserire modifiche in questo repository di coda.
opzioni:
diff -r 7252e7b7f07d -r 1856c2f4835c it/examples/mq.tarball.download.it
--- a/it/examples/mq.tarball.download.it Fri Aug 21 22:29:44 2009 +0200
+++ b/it/examples/mq.tarball.download.it Fri Aug 21 23:01:58 2009 +0200
@@ -1,5 +1,5 @@
-$download netplug-1.2.5.tar.bz2
+# Scarichiamo netplug-1.2.5.tar.bz2
$tar jxf netplug-1.2.5.tar.bz2$cd netplug-1.2.5$hg init
diff -r 7252e7b7f07d -r 1856c2f4835c it/examples/mq.tarball.newsource.it
--- a/it/examples/mq.tarball.newsource.it Fri Aug 21 22:29:44 2009 +0200
+++ b/it/examples/mq.tarball.newsource.it Fri Aug 21 23:01:58 2009 +0200
@@ -2,7 +2,7 @@
$hg qpop -a
la coda delle patch è vuota
$cd ..
-$download netplug-1.2.8.tar.bz2
+# Scarichiamo netplug-1.2.8.tar.bz2
$hg clone netplug-1.2.5 netplug-1.2.8
aggiorno la directory di lavoro
18 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti
diff -r 7252e7b7f07d -r 1856c2f4835c it/examples/mq.tarball.qinit.it
--- a/it/examples/mq.tarball.qinit.it Fri Aug 21 22:29:44 2009 +0200
+++ b/it/examples/mq.tarball.qinit.it Fri Aug 21 23:01:58 2009 +0200
@@ -6,13 +6,13 @@
$hg qrefresh$hg tip -p
changeset: 1:5227ba4b6a8b
-tag: qtip
-tag: correzione-assemblaggio.patch
-tag: tip
-tag: qbase
-user: Bryan O'Sullivan <bos@serpentine.com>
-date: Fri Jun 05 15:50:51 2009 +0000
-summary: corregge un problema di assemblaggio con gcc 4
+etichetta: qtip
+etichetta: correzione-assemblaggio.patch
+etichetta: tip
+etichetta: qbase
+utente: Bryan O'Sullivan <bos@serpentine.com>
+data: Fri Jun 05 15:50:51 2009 +0000
+sommario: corregge un problema di assemblaggio con gcc 4
diff -r e709896f2959 -r 5227ba4b6a8b netlink.c
--- a/netlink.c Fri Jun 05 15:50:49 2009 +0000
diff -r 7252e7b7f07d -r 1856c2f4835c it/examples/mq.tutorial.qnew.it
--- a/it/examples/mq.tutorial.qnew.it Fri Aug 21 22:29:44 2009 +0200
+++ b/it/examples/mq.tutorial.qnew.it Fri Aug 21 23:01:58 2009 +0200
@@ -1,21 +1,21 @@
$hg tip
changeset: 0:c6618fa9eed7
-tag: tip
-user: Bryan O'Sullivan <bos@serpentine.com>
-date: Fri Jun 05 15:50:56 2009 +0000
-summary: Prima modifica.
+etichetta: tip
+utente: Bryan O'Sullivan <bos@serpentine.com>
+data: Fri Jun 05 15:50:56 2009 +0000
+sommario: Prima modifica.
$hg qnew prima.patch$hg tip
changeset: 1:f32697f1a94e
-tag: qtip
-tag: prima.patch
-tag: tip
-tag: qbase
-user: Bryan O'Sullivan <bos@serpentine.com>
-date: Fri Jun 05 15:50:57 2009 +0000
-summary: [mq]: prima.patch
+etichetta: qtip
+etichetta: prima.patch
+etichetta: tip
+etichetta: qbase
+utente: Bryan O'Sullivan <bos@serpentine.com>
+data: Fri Jun 05 15:50:57 2009 +0000
+sommario: [mq]: prima.patch
$ls .hg/patches
prima.patch series status
diff -r 7252e7b7f07d -r 1856c2f4835c it/examples/mq.tutorial.qrefresh2.it
--- a/it/examples/mq.tutorial.qrefresh2.it Fri Aug 21 22:29:44 2009 +0200
+++ b/it/examples/mq.tutorial.qrefresh2.it Fri Aug 21 23:01:58 2009 +0200
@@ -11,7 +11,7 @@
--- a/file1 Fri Jun 05 15:50:56 2009 +0000
+++ b/file1 Fri Jun 05 15:51:00 2009 +0000
@@ -1,1 +1,3 @@
- line 1
+ riga 1
+riga 2
+riga 3