# HG changeset patch # User Giulio@puck # Date 1250342139 -7200 # Node ID 42e2c9d47ef435fd787c97d12cd35f240f33503e # Parent 8e3ccc187357be43fb7163b11b501f81864fcbce Minor changes and translation of code snippets for Ch.12. diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/ch12-mq.xml --- a/it/ch12-mq.xml Sat Aug 15 12:50:55 2009 +0200 +++ b/it/ch12-mq.xml Sat Aug 15 15:15:39 2009 +0200 @@ -13,7 +13,7 @@ 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. - Quando dovete mantenere solo alcune modifiche da mantenere, 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 sottoponete 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. + 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. Mantenere una singola patch per un albero a monte è un'attività un po' noiosa e soggetta a errori, ma non è difficile. Tuttavia, la complessità del problema cresce rapidamente man mano che il numero di patch che dovete mantenere aumenta. Con più di un piccolo numero di patch in mano, il compito di capire quali sono quelle che dovete applicare e di mantenerle passa da sgradevole a opprimente. @@ -34,17 +34,17 @@ Quilt gestisce una pila di patch per un albero di directory. Per cominciare a usarlo, dite a quilt di gestire un albero di directory e quali file volete che gestisca, in modo che memorizzi i nomi e il contenuto di quei file. Per correggere un bug, create una nuova patch (usando un singolo comando), modificate i file che dovete correggere, poi aggiornate la patch. - L'operazione di aggiornamento induce quilt a esaminare l'albero di directory completando la patch con tutte le modifiche che avete fatto. Potete creare un'altra patch in aggiunta alla prima, che terrà traccia dei cambiamenti richiesti per modificare l'albero da albero con una patch applicata ad albero con due patch applicate. + L'operazione di aggiornamento induce quilt a esaminare l'albero di directory completando la patch con tutte le modifiche che avete fatto. Sulla base di questa prima patch, potete creare un'altra patch che terrà traccia dei cambiamenti richiesti per modificare l'albero da albero con una patch applicata ad albero con due patch applicate. Potete scegliere quali sono le patch da applicare all'albero. Se estraete una patch, i cambiamenti effettuati da quella patch spariranno dall'albero di directory. Quilt si ricorda quali patch avete estratto, comunque, così potete inserire nuovamente una patch estratta e l'albero di directory verrà ripristinato per contenere le modifiche di quella patch. La cosa più importante è che potete eseguire il comando di aggiornamento in ogni momento e la patch applicata più recentemente verrà aggiornata. Questo significa che, in ogni momento, potete modificare sia l'insieme delle patch da applicare sia l'insieme dei cambiamenti effettuati da quelle patch. - Quilt non ha nulla a che vedere con gli strumenti di controllo di revisione, così funziona altrettanto bene con un gruppo di file estratti da un archivio compresso che con una copia di lavoro di Subversion. + Quilt non ha nulla a che fare con gli strumenti di controllo di revisione, così funziona altrettanto bene con un gruppo di file estratti da un archivio compresso che con una copia di lavoro di Subversion. Da patchwork quilt a Mercurial Queues - A metà del 2005, Chris Mason prese le funzionalità di quilt e implementò un'estensione chiamata Mercurial Queues, che aggiungeva a Mercurial un comportamento simile a quello di quilt. + A metà del 2005, Chris Mason prese le funzioni di quilt e implementò un'estensione chiamata Mercurial Queues, che aggiungeva a Mercurial un comportamento simile a quello di quilt. La differenza chiave tra quilt e MQ è che quilt non è progettato per interagire con alcun sistema di controllo di revisione, mentre MQ è integrata in Mercurial. Ogni patch che inserite è rappresentata sotto forma di changeset Mercurial. Se estraete una patch, il changeset relativo sparisce. @@ -63,7 +63,7 @@ Al contrario, il matrimonio tra controllo di revisione distribuito e patch realizzato da MQ rende molto più facile isolare il vostro lavoro. Le vostre patch si basano sulla normale cronologia delle revisioni e potete farle sparire e comparire a piacere. Se non vi piace una patch, potete scartarla. Se una patch non è esattamente come volete che sia, vi basta correggerla&emdash;tutte le volte che ne avete bisogno, fino a quando non l'avete ritoccata facendole assumere la forma che desiderate. - Per esempio, l'integrazione delle patch con il controllo di revisione facilita enormemente la comprensione delle patch e delle interazioni con il codice su cui si basano, nonché la correzione dei loro effetti. Dato che ogni patch applicata è associata a un changeset, potete invocare hg log con un nome di file per vedere quali changeset e quali patch hanno avuto effetto sul file. Potete usare il comando hg bisect per condurre una ricerca binaria attraverso tutti i changeset e le patch applicate in modo da scoprire dov'è è stato introdotto o corretto un bug. Potete usare il comando hg annotate per vedere quali changeset o patch hanno modificato una particolare riga di un file sorgente. E così via. + Per esempio, l'integrazione delle patch con il controllo di revisione facilita enormemente la comprensione delle patch e delle interazioni con il codice su cui si basano, nonché la correzione dei loro effetti. Dato che ogni patch applicata è associata a un changeset, potete invocare hg log con un nome di file per vedere quali changeset e quali patch hanno avuto effetto sul file. Potete usare il comando hg bisect per condurre una ricerca binaria attraverso tutti i changeset e le patch applicate in modo da scoprire dov'è stato introdotto o corretto un bug. Potete usare il comando hg annotate per vedere quali changeset o patch hanno modificato una particolare riga di un file sorgente. E così via. @@ -73,7 +73,7 @@ Il tradizionale comando Unix diff confronta due file e stampa una lista di differenze tra loro. Il comando patch interpreta queste differenze come modifiche da effettuare a un file. Date un'occhiata qui di seguito per vedere un semplice esempio di questi comandi in azione. - &interaction.mq.dodiff.diff; + &interaction.mq.dodiff.diff; Il tipo di file generato da diff (e che patch prende in ingresso) viene chiamato una patch (letteralmente, pezza) o un diff. Non c'è alcuna differenza tra una patch e un diff, ma noi useremo il termine patch, dato che è quello più comunemente usato. @@ -115,7 +115,7 @@ &interaction.mq.tutorial.qnew; - La directory .hg/patches contiene anche altri due nuovi file, series e status. Il file series elenca tutte le patch per questo repository di cui MQ è a conoscenza, con una patch per riga. Mercurial usa il file status per tenere traccia internamente di tutte le patch che MQ ha applicato a questo repository. + La directory .hg/patches contiene anche altri due nuovi file, series e status. Il file series elenca tutte le patch per questo repository di cui MQ è a conoscenza, con una patch per ogni riga. Mercurial usa il file status per tenere traccia internamente di tutte le patch che MQ ha applicato a questo repository. A volte potreste voler modificare il file series a mano, per esempio per cambiare la sequenza in cui sono applicate alcune patch. Tuttavia, modificare manualmente il file status è quasi sempre una cattiva idea, dato che così facendo si rischia facilmente di disorientare MQ. @@ -145,7 +145,7 @@ &interaction.mq.tutorial.qnew2; - Notate che la patch contiene le modifiche nella nostra patch precedente come parte del proprio contesto (potete vederlo più chiaramente nel risultato di hg annotate). + Notate che la patch contiene le modifiche della nostra patch precedente come parte del proprio contesto (potete vederlo più chiaramente nel risultato di hg annotate). Finora, con l'eccezione di qnew e qrefresh, siamo stati attenti a usare solo gli ordinari comandi Mercurial. Tuttavia, MQ fornisce molti comandi che sono più facili da usare quando state pensando in termini di patch, come illustrato di seguito. @@ -173,7 +173,7 @@ - Potete riapplicare una patch non applicata o estratta usando il comando qpush. Questo comando crea un nuovo changeset da far corrispondere alla patch, e le modifiche della patch diventano ancora una volta presenti nella directory di lavoro. Di seguito, vengono mostrati esempi di qpop e qpush in azione. + Potete riapplicare una patch non applicata o estratta usando il comando qpush. Questo comando crea un nuovo changeset da far corrispondere alla patch, e le modifiche della patch compaiono nuovamente nella directory di lavoro. Di seguito, vengono mostrati esempi di qpop e qpush in azione. &interaction.mq.tutorial.qpop; @@ -202,7 +202,7 @@ Lavorare su diverse patch alla volta - 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 quella patch per un po'. + 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. @@ -218,7 +218,7 @@ Se osservate le intestazioni di file in una patch, noterete che i percorsi dei nomi di solito hanno un componente aggiuntivo iniziale che non è presente nel percorso reale. Questo è uno strascico del modo in cui le persone erano abituate a generare le patch (questo modo viene ancora impiegato, ma piuttosto raramente ora che sono disponibili strumenti di controllo di revisione più moderni). - Alice avrebbe estratto un archivio, modificato i file e poi deciso di voler creare una patch. Quindi avrebbe rinominato la directory di lavoro, estratto nuovamente l'archivio (da qui nasce il bisogno di modificare il nome) e usato le opzioni e del comando diff per generare ricorsivamente una patch tra la directory non modificata e quella modificata. Come risultato, sarebbe che il nome della directory non modificata si sarebbe trovato all'inizio del percorso sulla parte sinistra in ogni intestazione di file e il nome della directory modificata si sarebbe trovato all'inizio del percorso sulla parte destra. + Alice avrebbe estratto un archivio, modificato i file e poi deciso di voler creare una patch. Quindi avrebbe rinominato la directory di lavoro, estratto nuovamente l'archivio (da qui nasce il bisogno di modificare il nome) e usato le opzioni e del comando diff per generare ricorsivamente una patch tra la directory non modificata e quella modificata. Come risultato, il nome della directory non modificata si sarebbe trovato all'inizio del percorso sulla parte sinistra di ogni intestazione di file e il nome della directory modificata si sarebbe trovato all'inizio del percorso sulla parte destra. Dato che chi riceveva una patch dalle Alice della rete probabilmente non avrebbe avuto le due copie, modificata e non, della directory con esattamente gli stessi nomi, il comando patch è stato dotato di un'opzione che indica il numero di elementi iniziali da eliminare dal percorso al momento di applicare una patch. Questo numero viene chiamato il numero di cancellazioni. @@ -226,14 +226,14 @@ Il numero di cancellazioni standard per le patch è pari a uno, in quanto quasi tutte le patch contengono un elemento iniziale da eliminare nel percorso. Il comando hg diff di Mercurial genera nomi di percorso in questa forma e sia il comando hg import che MQ si aspettano patch con un numero di cancellazioni pari a uno. - Se qualcuno vi invia una patch che volete aggiungere alla vostra coda delle patch e la patch necessita di un numero di cancellazioni diverso da uno, non potete usare semplicemente qimport con la patch, perché qimport non è ancora dotato di un'opzione -p (si veda il problema 311 per i dettagli). L'alternativa migliore che avete è quella di creare una vostra patch con qnew e poi usare patch -pN per applicare la patch che avete ricevuto, seguito da hg addremove per registrare qualsiasi file aggiunto o rimosso dalla patch, seguito da hg qrefresh. Questa complessità potrebbe diventare inutile una volta che il problema 311 venga risolto. + Se qualcuno vi invia una patch che volete aggiungere alla vostra coda delle patch e la patch necessita di un numero di cancellazioni diverso da uno, non potete usare semplicemente qimport con la patch, perché qimport non è ancora dotato di un'opzione -p (si veda il problema 311 per i dettagli). L'alternativa migliore che avete è quella di creare una vostra patch con qnew e poi usare il comando patch -pN per applicare la patch che avete ricevuto, seguito da hg addremove per registrare qualsiasi file aggiunto o rimosso dalla patch, seguito da hg qrefresh. Questa complessità potrebbe diventare inutile una volta che il problema 311 verrà risolto. Strategie per applicare una patch - Quando patch applica un blocco, prova a impiegare una serie di strategie successive sempre meno accurate per portare a termine l'operazione. Questo impiego di tecniche alternative spesso rende possibile prendere una patch che è stata generata a partire da una vecchia versione di un file e applicarla alla nuova versione di quel file. + Quando patch applica un blocco, prova a impiegare una serie di strategie successive sempre meno accurate per portare a termine l'operazione. Questo impiego di tecniche alternative rende spesso possibile prendere una patch che è stata generata a partire da una vecchia versione di un file e applicarla alla nuova versione di quel file. Come prima cosa, patch cerca una corrispondenza esatta, dove i numeri di riga, il contesto e il testo da modificare devono applicarsi perfettamente. Se non riesce a trovare una corrispondenza esatta, cerca una corrispondenza esatta per il contesto, senza onorare le informazioni sulla numerazione delle righe. Se questa strategia ha successo, il comando stampa una riga dicendo che il blocco è stato applicato, ma con un certo scostamento rispetto al numero di riga originale. @@ -277,12 +277,12 @@ Se di solito la vostra patch si applicava in maniera pulita e ora non lo fa più perché avete modificato il codice sottostante su cui si basavano le vostre patch, Mercurial Queues può aiutarvi: leggete la per i dettagli. - Sfortunatamente, non esiste alcuna tecnica particolare per gestire i blocchi rifiutati. Molto spesso, avrete bisogno di esaminare il file .rej e di modificare il file di destinazione, applicando a mano i blocchi rifiutati. - - Un programmatore del kernel di Linux, Chris Mason (l'autore di Mercurial Queues), ha realizzato uno strumento chiamato mpatch (http://oss.oracle.com/~mason/mpatch/), che adotta un approccio semplice per automatizzare l'applicazione dei blocchi rifiutati da patch. Il comando mpatch può aiutarvi nel caso il blocco sia stato rifiutato per quattro tipiche ragioni: + Sfortunatamente, non esiste alcuna tecnica particolare per gestire i blocchi rifiutati. Molto spesso, dovrete esaminare il file .rej e modificare il file di destinazione, applicando a mano i blocchi rifiutati. + + Un programmatore del kernel di Linux, Chris Mason (l'autore di Mercurial Queues), ha realizzato uno strumento chiamato mpatch (http://oss.oracle.com/~mason/mpatch/), che adotta un metodo semplice per automatizzare l'applicazione dei blocchi rifiutati da patch. Il comando mpatch può aiutarvi nel caso il blocco sia stato rifiutato per quattro tipiche ragioni: - il contesto nel mezzo di un blocco è cambiato; + il contesto in mezzo a un blocco è cambiato; all'inizio o alla fine del blocco manca una certa quantità di contesto; @@ -310,7 +310,7 @@ - Convertire verso e da revisioni permanenti + Convertire in e da revisioni permanenti Una volta che avete finito di lavorare con una patch e volete trasformarla in un changeset permanente, usate il comando hg qfinish. Passate una revisione al comando per identificare la patch che volete trasformare in un normale changeset; questa patch deve essere già stata applicata. @@ -339,7 +339,7 @@ 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. - Potete identificare una patch di destinazione usando il nome della patch oppure un numero. Se usate un identificatore numerico, il conteggio delle patch parte da zero; questo significa che la prima patch corrisponde a zero, la seconda a uno, e così via. + Potete indicare una patch di destinazione usando il nome della patch oppure un numero. Se usate un identificatore numerico, il conteggio delle patch parte da zero: questo significa che la prima patch corrisponde a zero, la seconda a uno, e così via. @@ -366,7 +366,7 @@ 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 unione sfrutta il normale meccanismo di unione di Mercurial, quindi potrebbe aprire uno strumento grafico per le unioni in modo da aiutarvi a risolvere i problemi. + 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. Quando avete finito di risolvere gli effetti di una patch, MQ aggiornerà la vostra patch sulla base dei risultati dell'unione. @@ -390,7 +390,7 @@ hg email qbase:qtip (Non sapete cosa sia un bombardamento di patch? Leggete la .) - Avete bisogno di vedere tutte le patch che da foo.patch in poi hanno toccato i file contenuti in una sottodirectory del vostro albero? + Avete bisogno di vedere tutte le patch che da foo.patch in poi hanno coinvolto i file contenuti in una sottodirectory del vostro albero? hg log -r foo.patch:qtip sottodirectory @@ -410,7 +410,7 @@ Normalmente, quando estraete una patch tramite qpop e poi la reinserite tramite qpush, il changeset che rappresenta la patch dopo l'estrazione/inserimento avrà una diversa identità rispetto al changeset che rappresentava l'hash in precedenza. Leggete la per sapere perché. - Non è una buona idea usare hg merge per unire i cambiamenti da un altro ramo con un changeset corrispondente a una patch, almeno se volete mantenere la natura di patch di quel changeset e dei changeset che si trovano sotto a quello nella pila delle patch. Se provate a farlo, sembrerà avere successo, ma l'effetto sarà quello di disorientare MQ. + Non è una buona idea usare hg merge per unire i cambiamenti provenienti da un altro ramo con un changeset corrispondente a una patch, almeno se volete mantenere la natura di patch di quel changeset e dei changeset che si trovano sotto a quello nella pila delle patch. Se provate a farlo, sembrerà avere successo, ma l'effetto sarà quello di disorientare MQ. @@ -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, potete 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 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. @@ -464,7 +464,7 @@ &interaction.mq.tools.tools; - Il pacchetto patchutils web:patchutils è inestimabile. Fornisce un insieme di piccole utilità che seguono la filosofia Unix: ognuna effettua una singola operazione utile su una patch. Il comando di patchutils che uso di più è filterdiff, che estrae sottoinsiemi di un file di patch. Per esempio, data una patch che modifica centinaia di file attraverso dozzine di directory, una singola invocazione di filterdiff può generare una patch più piccola che coinvolge solo i file il cui nome corrisponde a un particolare pattern di tipo glob. Leggete la per un altro esempio. + Il pacchetto patchutils web:patchutils è inestimabile. Fornisce un insieme di piccole utilità che seguono la filosofia Unix: ognuna effettua una singola operazione utile su una patch. Il comando di patchutils che uso di più è filterdiff, che estrae sottoinsiemi di un file di patch. Per esempio, data una patch che modifica centinaia di file attraverso dozzine di directory, una singola invocazione di filterdiff può generare una patch più piccola che coinvolge solo i file il cui nome corrisponde a un particolare pattern di tipo glob. Leggete la per un altro esempio. @@ -472,7 +472,7 @@ 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. - Date nomi descrittivi alle vostre patch. Un buon nome per una patch potrebbe essere rework-device-alloc.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. + 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. @@ -495,11 +495,11 @@ &interaction.mq.tarball.qinit; - Diciamo che trascorrono alcune settimane o mesi e gli autori di quel pacchetto rilascia una nuova versione. Prima di tutto, propagate i loro cambiamenti nel repository. + Diciamo che trascorrono alcune settimane o mesi e gli autori di quel pacchetto rilasciano una nuova versione. Prima di tutto, propagate i loro cambiamenti nel repository. &interaction.mq.tarball.newsource; - La serie di comandi iniziata con hg locate che avete appena invocato cancella tutti i file dalla directory di lavoro, in modo che l'opzione di hg commit possa effettivamente dirvi quali file sono stati davvero rimossi nella nuova versione dei sorgenti. + La coppia di comandi che comincia con hg locate appena invocata cancella tutti i file dalla directory di lavoro, in modo che l'opzione di hg commit possa effettivamente dirvi quali file sono stati davvero rimossi nella nuova versione dei sorgenti. Infine, potete applicare le vostre patch al nuovo albero. diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/auto-snippets.xml --- a/it/examples/auto-snippets.xml Sat Aug 15 12:50:55 2009 +0200 +++ b/it/examples/auto-snippets.xml Sat Aug 15 15:15:39 2009 +0200 @@ -84,8 +84,8 @@ - - + + @@ -155,7 +155,7 @@ - + @@ -168,23 +168,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/ch11-qdelete.convert.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/ch11-qdelete.convert.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,13 @@ + +$ hg qnew buona.patch +$ echo a > a +$ hg add a +$ hg qrefresh -m 'Buona modifica.' +$ hg qfinish tip +$ hg qapplied +$ hg tip --style=compact +0[tip] 8eae2605f537 2009-06-05 15:49 +0000 bos + Buona modifica. + + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/ch11-qdelete.go.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/ch11-qdelete.go.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,15 @@ + +$ hg init miorepo +$ cd miorepo +$ hg qinit +$ hg qnew cattiva.patch +$ echo a > a +$ hg add a +$ hg qrefresh +$ hg qdelete cattiva.patch +fallimento: non posso cancellare la patch applicata cattiva.patch +$ hg qpop +la coda delle patch è vuota +$ hg qdelete cattiva.patch + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.dodiff.diff.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.dodiff.diff.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,16 @@ + +$ echo 'questo è il mio primo pensiero' > vecchiofile +$ echo 'ho cambiato idea' > nuovofile +$ diff -u vecchiofile nuovofile > piccola.patch +$ cat piccola.patch +--- vecchiofile 2009-06-05 15:50:32.000000000 +0000 ++++ nuovofile 2009-06-05 15:50:32.000000000 +0000 +@@ -1 +1 @@ +-questo è il mio primo pensiero ++ho cambiato idea +$ patch < piccola.patch +correggo il file vecchiofile +$ cat vecchiofile +ho cambiato idea + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.id.output.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.id.output.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,35 @@ + +$ hg qapplied +prima.patch +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 + +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 + +$ hg export seconda.patch +# HG changeset di patch +# Utente Bryan O'Sullivan <bos@serpentine.com> +# Data 1244217046 0 +# ID di nodo dee839d89dc6e420682b02551b31e8375929aa7c +# Genitore 32b3cae9e753537be60bb2fbfefe0de3e19ec4a3 +[mq]: seconda.patch + +diff -r 32b3cae9e753 -r dee839d89dc6 altro.c +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/altro.c Fri Jun 05 15:50:46 2009 +0000 +@@ -0,0 +1,1 @@ ++double u; + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.qinit-help.help.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.qinit-help.help.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,20 @@ + +$ hg help qinit +hg qinit [-c] + +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. + +opzioni: + + -c --create-repo crea il repository di coda + +usate "hg -v help qinit" per vedere le opzioni globali + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tarball.download.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tarball.download.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,12 @@ + +$ download netplug-1.2.5.tar.bz2 +$ tar jxf netplug-1.2.5.tar.bz2 +$ cd netplug-1.2.5 +$ hg init +$ hg commit -q --addremove --message netplug-1.2.5 +$ cd .. +$ hg clone netplug-1.2.5 netplug +aggiorno la directory di lavoro +18 file aggiornati, 0 file uniti, 0 file rimossi, 0 file irrisolti + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tarball.newsource.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tarball.newsource.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,16 @@ + +$ hg qpop -a +la coda delle patch è vuota +$ cd .. +$ download 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 +$ cd netplug-1.2.8 +$ hg locate -0 | xargs -0 rm +$ cd .. +$ tar jxf netplug-1.2.8.tar.bz2 +$ cd netplug-1.2.8 +$ hg commit --addremove --message netplug-1.2.8 + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tarball.qinit.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tarball.qinit.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,31 @@ + +$ cd netplug +$ hg qinit +$ hg qnew -m 'corregge un problema di assemblaggio con gcc 4' correzione-assemblaggio.patch +$ perl -pi -e 's/int addr_len/socklen_t addr_len/' netlink.c +$ 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 + +diff -r e709896f2959 -r 5227ba4b6a8b netlink.c +--- a/netlink.c Fri Jun 05 15:50:49 2009 +0000 ++++ b/netlink.c Fri Jun 05 15:50:51 2009 +0000 +@@ -275,7 +275,7 @@ + exit(1); + } + +- int addr_len = sizeof(addr); ++ socklen_t addr_len = sizeof(addr); + + if (getsockname(fd, (struct sockaddr *) &addr, &addr_len) == -1) { + do_log(LOG_ERR, "Could not get socket details: %m"); + + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tarball.repush.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tarball.repush.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,16 @@ + +$ cd ../netplug +$ hg pull ../netplug-1.2.8 +estraggo da ../netplug-1.2.8 +cerco i cambiamenti +aggiungo i changeset +aggiungo i manifest +aggiungo i cambiamenti ai file +aggiunti 1 changeset con 12 cambiamenti a 12 file +(eseguite 'hg update' per ottenere una copia di lavoro) +$ hg qpush -a +(la directory di lavoro non è alla punta) +applico correzione-assemblaggio.patch +ora a: correzione-assemblaggio.patch + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tools.lsdiff.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tools.lsdiff.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,24 @@ + +$ lsdiff -nvv rimuove-controlli-ridondati-su-null.patch +22 File #1 a/drivers/char/agp/sgi-agp.c + 24 Blocco #1 static int __devinit agp_sgi_init(void) +37 File #2 a/drivers/char/hvcs.c + 39 Blocco #1 static struct tty_operations hvcs_ops = + 53 Blocco #2 static int hvcs_alloc_index_list(int n) +69 File #3 a/drivers/message/fusion/mptfc.c + 71 Blocco #1 mptfc_GetFcDevPage0(MPT_ADAPTER *ioc, in +85 File #4 a/drivers/message/fusion/mptsas.c + 87 Blocco #1 mptsas_probe_hba_phys(MPT_ADAPTER *ioc) +98 File #5 a/drivers/net/fs_enet/fs_enet-mii.c + 100 Blocco #1 static struct fs_enet_mii_bus *create_bu +111 File #6 a/drivers/net/wireless/ipw2200.c + 113 Blocco #1 static struct ipw_fw_error *ipw_alloc_er + 126 Blocco #2 static ssize_t clear_error(struct device + 140 Blocco #3 static void ipw_irq_tasklet(struct ipw_p + 150 Blocco #4 static void ipw_pci_remove(struct pci_de +164 File #7 a/drivers/scsi/libata-scsi.c + 166 Blocco #1 int ata_cmd_ioctl(struct scsi_device *sc +178 File #8 a/drivers/video/au1100fb.c + 180 Blocco #1 void __exit au1100fb_cleanup(void) + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tools.tools.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tools.tools.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,26 @@ + +$ diffstat -p1 rimuove-controlli-ridondati-su-null.patch + drivers/char/agp/sgi-agp.c | 5 ++--- + drivers/char/hvcs.c | 11 +++++------ + drivers/message/fusion/mptfc.c | 6 ++---- + drivers/message/fusion/mptsas.c | 3 +-- + drivers/net/fs_enet/fs_enet-mii.c | 3 +-- + drivers/net/wireless/ipw2200.c | 22 ++++++---------------- + drivers/scsi/libata-scsi.c | 4 +--- + drivers/video/au1100fb.c | 3 +-- + 8 file modificati, 19 inserimenti(+), 38 cancellazioni(-) +$ filterdiff -i '*/video/*' rimuove-controlli-ridondati-su-null.patch +--- a/drivers/video/au1100fb.c~rimuove-controlli-ridondanti-su-null-prima-di-free-nei-driver ++++ a/drivers/video/au1100fb.c +@@ -743,8 +743,7 @@ void __exit au1100fb_cleanup(void) + { + driver_unregister(&au1100fb_driver); + +- if (drv_info.opt_mode) +- kfree(drv_info.opt_mode); ++ kfree(drv_info.opt_mode); + } + + module_init(au1100fb_init); + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.add.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.add.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,7 @@ + +$ echo 'file 3, riga 1' >> file3 +$ hg qnew aggiunta-file3.patch +$ hg qnew -f aggiunta-file3.patch +fallimento: la patch "aggiunta-file3.patch" esiste già + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qinit.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qinit.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,10 @@ + +$ hg init mq-prova +$ cd mq-prova +$ echo 'riga 1' > file1 +$ echo "un'altra riga 1" > file2 +$ hg add file1 file2 +$ hg commit -m 'Prima modifica.' +$ hg qinit + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qnew.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qnew.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,23 @@ + +$ 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. + +$ 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 + +$ ls .hg/patches +prima.patch series status + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qnew2.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qnew2.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,31 @@ + +$ hg qnew seconda.patch +$ hg log --style=compact --limit=2 +2[qtip,seconda.patch,tip] 2d7ecb80769d 2009-06-05 15:51 +0000 bos + [mq]: seconda.patch + +1[prima.patch,qbase] 8593307a06ec 2009-06-05 15:51 +0000 bos + [mq]: prima.patch + +$ echo 'riga 4' >> file1 +$ hg qrefresh +$ hg tip --style=compact --patch +2[qtip,seconda.patch,tip] 78d47e79ab59 2009-06-05 15:51 +0000 bos + [mq]: seconda.patch + +diff -r 8593307a06ec -r 78d47e79ab59 file1 +--- a/file1 Fri Jun 05 15:51:00 2009 +0000 ++++ b/file1 Fri Jun 05 15:51:02 2009 +0000 +@@ -1,3 +1,4 @@ + riga 1 + riga 2 + riga 3 ++riga 4 + +$ hg annotate file1 +0: riga 1 +1: riga 2 +1: riga 3 +2: riga 4 + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qpop.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qpop.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,17 @@ + +$ hg qapplied +prima.patch +seconda.patch +$ hg qpop +ora a: prima.patch +$ hg qseries +prima.patch +seconda.patch +$ hg qapplied +prima.patch +$ cat file1 +riga 1 +riga 2 +riga 3 + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qpush-a.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qpush-a.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,11 @@ + +$ hg qpush -a +applico seconda.patch +ora a: seconda.patch +$ cat file1 +riga 1 +riga 2 +riga 3 +riga 4 + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qrefresh.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qrefresh.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,24 @@ + +$ echo 'riga 2' >> file1 +$ hg diff +diff -r f32697f1a94e file1 +--- a/file1 Fri Jun 05 15:50:57 2009 +0000 ++++ b/file1 Fri Jun 05 15:50:58 2009 +0000 +@@ -1,1 +1,2 @@ + riga 1 ++riga 2 +$ hg qrefresh +$ hg diff +$ hg tip --style=compact --patch +1[qtip,prima.patch,tip,qbase] 18f39bf02ad5 2009-06-05 15:50 +0000 bos + [mq]: prima.patch + +diff -r c6618fa9eed7 -r 18f39bf02ad5 file1 +--- a/file1 Fri Jun 05 15:50:56 2009 +0000 ++++ b/file1 Fri Jun 05 15:50:59 2009 +0000 +@@ -1,1 +1,2 @@ + riga 1 ++riga 2 + + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qrefresh2.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qrefresh2.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,19 @@ + +$ echo 'riga 3' >> file1 +$ hg status +M file1 +$ hg qrefresh +$ hg tip --style=compact --patch +1[qtip,prima.patch,tip,qbase] 8593307a06ec 2009-06-05 15:51 +0000 bos + [mq]: prima.patch + +diff -r c6618fa9eed7 -r 8593307a06ec file1 +--- 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 2 ++riga 3 + + + diff -r 8e3ccc187357 -r 42e2c9d47ef4 it/examples/mq.tutorial.qseries.it --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/it/examples/mq.tutorial.qseries.it Sat Aug 15 15:15:39 2009 +0200 @@ -0,0 +1,9 @@ + +$ hg qseries +prima.patch +seconda.patch +$ hg qapplied +prima.patch +seconda.patch + +