1.. include:: ../disclaimer-ita.rst
2
3:Original: :ref:`Documentation/process/submitting-patches.rst <submittingpatches>`
4:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
5
6.. _it_submittingpatches:
7
8Inviare patch: la guida essenziale per vedere il vostro codice nel kernel
9=========================================================================
10
11Una persona o un'azienda che volesse inviare una patch al kernel potrebbe
12sentirsi scoraggiata dal processo di sottomissione, specialmente quando manca
13una certa familiarità col "sistema".  Questo testo è una raccolta di
14suggerimenti che aumenteranno significativamente le probabilità di vedere le
15vostre patch accettate.
16
17Questo documento contiene un vasto numero di suggerimenti concisi.  Per
18maggiori dettagli su come funziona il processo di sviluppo del kernel leggete
19:ref:`Documentation/translations/it_IT/process <it_development_process_main>`.
20Leggete anche :ref:`Documentation/translations/it_IT/process/submit-checklist.rst <it_submitchecklist>`
21per una lista di punti da verificare prima di inviare del codice.  Se state
22inviando un driver, allora leggete anche :ref:`Documentation/translations/it_IT/process/submitting-drivers.rst <it_submittingdrivers>`;
23per delle patch relative alle associazioni per Device Tree leggete
24Documentation/devicetree/bindings/submitting-patches.rst.
25
26Molti di questi passi descrivono il comportamento di base del sistema di
27controllo di versione ``git``; se utilizzate ``git`` per preparare le vostre
28patch molto del lavoro più ripetitivo lo troverete già fatto per voi, tuttavia
29dovete preparare e documentare un certo numero di patch.  Generalmente, l'uso
30di ``git`` renderà la vostra vita di sviluppatore del kernel più facile.
31
320) Ottenere i sorgenti attuali
33------------------------------
34
35Se non avete un repositorio coi sorgenti del kernel più recenti, allora usate
36``git`` per ottenerli.  Vorrete iniziare col repositorio principale che può
37essere recuperato col comando::
38
39  git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
40
41Notate, comunque, che potreste non voler sviluppare direttamente coi sorgenti
42principali del kernel.  La maggior parte dei manutentori hanno i propri
43sorgenti e desiderano che le patch siano preparate basandosi su di essi.
44Guardate l'elemento **T:** per un determinato sottosistema nel file MAINTANERS
45che troverete nei sorgenti, o semplicemente chiedete al manutentore nel caso
46in cui i sorgenti da usare non siano elencati il quel file.
47
48Esiste ancora la possibilità di scaricare un rilascio del kernel come archivio
49tar (come descritto in una delle prossime sezioni), ma questa è la via più
50complicata per sviluppare per il kernel.
51
521) ``diff -up``
53---------------
54
55Se dovete produrre le vostre patch a mano, usate ``diff -up`` o ``diff -uprN``
56per crearle.  Git produce di base le patch in questo formato; se state
57usando ``git``, potete saltare interamente questa sezione.
58
59Tutte le modifiche al kernel Linux avvengono mediate patch, come descritte
60in :manpage:`diff(1)`.  Quando create la vostra patch, assicuratevi di
61crearla nel formato "unified diff", come l'argomento ``-u`` di
62:manpage:`diff(1)`.
63Inoltre, per favore usate l'argomento ``-p`` per mostrare la funzione C
64alla quale si riferiscono le diverse modifiche - questo rende il risultato
65di ``diff`` molto più facile da leggere.  Le patch dovrebbero essere basate
66sulla radice dei sorgenti del kernel, e non sulle sue sottocartelle.
67
68Per creare una patch per un singolo file, spesso è sufficiente fare::
69
70	SRCTREE=linux
71	MYFILE=drivers/net/mydriver.c
72
73	cd $SRCTREE
74	cp $MYFILE $MYFILE.orig
75	vi $MYFILE	# make your change
76	cd ..
77	diff -up $SRCTREE/$MYFILE{.orig,} > /tmp/patch
78
79Per creare una patch per molteplici file, dovreste spacchettare i sorgenti
80"vergini", o comunque non modificati, e fare un ``diff`` coi vostri.
81Per esempio::
82
83	MYSRC=/devel/linux
84
85	tar xvfz linux-3.19.tar.gz
86	mv linux-3.19 linux-3.19-vanilla
87	diff -uprN -X linux-3.19-vanilla/Documentation/dontdiff \
88		linux-3.19-vanilla $MYSRC > /tmp/patch
89
90``dontdiff`` è una lista di file che sono generati durante il processo di
91compilazione del kernel; questi dovrebbero essere ignorati in qualsiasi
92patch generata con :manpage:`diff(1)`.
93
94Assicuratevi che la vostra patch non includa file che non ne fanno veramente
95parte.  Al fine di verificarne la correttezza, assicuratevi anche di
96revisionare la vostra patch -dopo- averla generata con :manpage:`diff(1)`.
97
98Se le vostre modifiche producono molte differenze, allora dovrete dividerle
99in patch indipendenti che modificano le cose in passi logici;  leggete
100:ref:`split_changes`.  Questo faciliterà la revisione da parte degli altri
101sviluppatori, il che è molto importante se volete che la patch venga accettata.
102
103Se state utilizzando ``git``, ``git rebase -i`` può aiutarvi nel procedimento.
104Se non usate ``git``, un'alternativa popolare è ``quilt``
105<http://savannah.nongnu.org/projects/quilt>.
106
107.. _it_describe_changes:
108
1092) Descrivete le vostre modifiche
110---------------------------------
111
112Descrivete il vostro problema. Esiste sempre un problema che via ha spinto
113ha fare il vostro lavoro, che sia la correzione di un baco da una riga o una
114nuova funzionalità da 5000 righe di codice.  Convincete i revisori che vale
115la pena risolvere il vostro problema e che ha senso continuare a leggere oltre
116al primo paragrafo.
117
118Descrivete ciò che sarà visibile agli utenti.  Chiari incidenti nel sistema
119e blocchi sono abbastanza convincenti, ma non tutti i bachi sono così evidenti.
120Anche se il problema è stato scoperto durante la revisione del codice,
121descrivete l'impatto che questo avrà sugli utenti.  Tenete presente che
122la maggior parte delle installazioni Linux usa un kernel che arriva dai
123sorgenti stabili o dai sorgenti di una distribuzione particolare che prende
124singolarmente le patch dai sorgenti principali; quindi, includete tutte
125le informazioni che possono essere utili a capire le vostre modifiche:
126le circostanze che causano il problema, estratti da dmesg, descrizioni di
127un incidente di sistema, prestazioni di una regressione, picchi di latenza,
128blocchi, eccetera.
129
130Quantificare le ottimizzazioni e i compromessi.  Se affermate di aver
131migliorato le prestazioni, il consumo di memoria, l'impatto sollo stack,
132o la dimensione del file binario, includete dei numeri a supporto della
133vostra dichiarazione.  Ma ricordatevi di descrivere anche eventuali costi
134che non sono ovvi.  Solitamente le ottimizzazioni non sono gratuite, ma sono
135un compromesso fra l'uso di CPU, la memoria e la leggibilità; o, quando si
136parla di ipotesi euristiche, fra differenti carichi.  Descrivete i lati
137negativi che vi aspettate dall'ottimizzazione cosicché i revisori possano
138valutare i costi e i benefici.
139
140Una volta che il problema è chiaro, descrivete come lo risolvete andando
141nel dettaglio tecnico.  È molto importante che descriviate la modifica
142in un inglese semplice cosicché i revisori possano verificare che il codice si
143comporti come descritto.
144
145I manutentori vi saranno grati se scrivete la descrizione della patch in un
146formato che sia compatibile con il gestore dei sorgenti usato dal kernel,
147``git``, come un "commit log".  Leggete :ref:`it_explicit_in_reply_to`.
148
149Risolvete solo un problema per patch.  Se la vostra descrizione inizia ad
150essere lunga, potrebbe essere un segno che la vostra patch necessita d'essere
151divisa. Leggete :ref:`split_changes`.
152
153Quando inviate o rinviate una patch o una serie, includete la descrizione
154completa delle modifiche e la loro giustificazione.  Non limitatevi a dire che
155questa è la versione N della patch (o serie).  Non aspettatevi che i
156manutentori di un sottosistema vadano a cercare le versioni precedenti per
157cercare la descrizione da aggiungere.  In pratica, la patch (o serie) e la sua
158descrizione devono essere un'unica cosa.  Questo aiuta i manutentori e i
159revisori.  Probabilmente, alcuni revisori non hanno nemmeno ricevuto o visto
160le versioni precedenti della patch.
161
162Descrivete le vostro modifiche usando l'imperativo, per esempio "make xyzzy
163do frotz" piuttosto che "[This patch] makes xyzzy do frotz" or "[I] changed
164xyzzy to do frotz", come se steste dando ordini al codice di cambiare il suo
165comportamento.
166
167Se la patch corregge un baco conosciuto, fare riferimento a quel baco inserendo
168il suo numero o il suo URL.  Se la patch è la conseguenza di una discussione
169su una lista di discussione, allora fornite l'URL all'archivio di quella
170discussione;  usate i collegamenti a https://lkml.kernel.org/ con il
171``Message-Id``, in questo modo vi assicurerete che il collegamento non diventi
172invalido nel tempo.
173
174Tuttavia, cercate di rendere la vostra spiegazione comprensibile anche senza
175far riferimento a fonti esterne.  In aggiunta ai collegamenti a bachi e liste
176di discussione, riassumente i punti più importanti della discussione che hanno
177portato alla creazione della patch.
178
179Se volete far riferimento a uno specifico commit, non usate solo
180l'identificativo SHA-1.  Per cortesia, aggiungete anche la breve riga
181riassuntiva del commit per rendere la chiaro ai revisori l'oggetto.
182Per esempio::
183
184	Commit e21d2170f36602ae2708 ("video: remove unnecessary
185	platform_set_drvdata()") removed the unnecessary
186	platform_set_drvdata(), but left the variable "dev" unused,
187	delete it.
188
189Dovreste anche assicurarvi di usare almeno i primi 12 caratteri
190dell'identificativo SHA-1.  Il repositorio del kernel ha *molti* oggetti e
191questo rende possibile la collisione fra due identificativi con pochi
192caratteri.  Tenete ben presente che anche se oggi non ci sono collisioni con il
193vostro identificativo a 6 caratteri, potrebbero essercene fra 5 anni da oggi.
194
195Se la vostra patch corregge un baco in un commit specifico, per esempio avete
196trovato un problema usando ``git bisect``, per favore usate l'etichetta
197'Fixes:' indicando i primi 12 caratteri dell'identificativo SHA-1 seguiti
198dalla riga riassuntiva.  Per esempio::
199
200	Fixes: e21d2170f366 ("video: remove unnecessary platform_set_drvdata()")
201
202La seguente configurazione di ``git config`` può essere usata per formattare
203i risultati dei comandi ``git log`` o ``git show`` come nell'esempio
204precedente::
205
206	[core]
207		abbrev = 12
208	[pretty]
209		fixes = Fixes: %h (\"%s\")
210
211.. _it_split_changes:
212
2133) Separate le vostre modifiche
214-------------------------------
215
216Separate ogni **cambiamento logico** in patch distinte.
217
218Per esempio, se i vostri cambiamenti per un singolo driver includono
219sia delle correzioni di bachi che miglioramenti alle prestazioni,
220allora separateli in due o più patch.  Se i vostri cambiamenti includono
221un aggiornamento dell'API e un nuovo driver che lo sfrutta, allora separateli
222in due patch.
223
224D'altro canto, se fate una singola modifica su più file, raggruppate tutte
225queste modifiche in una singola patch.  Dunque, un singolo cambiamento logico
226è contenuto in una sola patch.
227
228Il punto da ricordare è che ogni modifica dovrebbe fare delle modifiche
229che siano facilmente comprensibili e che possano essere verificate dai revisori.
230Ogni patch dovrebbe essere giustificabile di per sé.
231
232Se al fine di ottenere un cambiamento completo una patch dipende da un'altra,
233va bene.  Semplicemente scrivete una nota nella descrizione della patch per
234farlo presente: **"this patch depends on patch X"**.
235
236Quando dividete i vostri cambiamenti in una serie di patch, prestate
237particolare attenzione alla verifica di ogni patch della serie; per ognuna
238il kernel deve compilare ed essere eseguito correttamente.  Gli sviluppatori
239che usano ``git bisect`` per scovare i problemi potrebbero finire nel mezzo
240della vostra serie in un punto qualsiasi; non vi saranno grati se nel mezzo
241avete introdotto dei bachi.
242
243Se non potete condensare la vostra serie di patch in una più piccola, allora
244pubblicatene una quindicina alla volta e aspettate che vengano revisionate
245ed integrate.
246
247
2484) Verificate lo stile delle vostre modifiche
249---------------------------------------------
250
251Controllate che la vostra patch non violi lo stile del codice, maggiori
252dettagli sono disponibili in :ref:`Documentation/translations/it_IT/process/coding-style.rst <it_codingstyle>`.
253Non farlo porta semplicemente a una perdita di tempo da parte dei revisori e
254voi vedrete la vostra patch rifiutata, probabilmente senza nemmeno essere stata
255letta.
256
257Un'eccezione importante si ha quando del codice viene spostato da un file
258ad un altro -- in questo caso non dovreste modificare il codice spostato
259per nessun motivo, almeno non nella patch che lo sposta.  Questo separa
260chiaramente l'azione di spostare il codice e il vostro cambiamento.
261Questo aiuta enormemente la revisione delle vere differenze e permette agli
262strumenti di tenere meglio la traccia della storia del codice.
263
264Prima di inviare una patch, verificatene lo stile usando l'apposito
265verificatore (scripts/checkpatch.pl).  Da notare, comunque, che il verificator
266di stile dovrebbe essere visto come una guida, non come un sostituto al
267giudizio umano.  Se il vostro codice è migliore nonostante una violazione
268dello stile, probabilmente è meglio lasciarlo com'è.
269
270Il verificatore ha tre diversi livelli di severità:
271 - ERROR: le cose sono molto probabilmente sbagliate
272 - WARNING: le cose necessitano d'essere revisionate con attenzione
273 - CHECK: le cose necessitano di un pensierino
274
275Dovreste essere in grado di giustificare tutte le eventuali violazioni rimaste
276nella vostra patch.
277
278
2795) Selezionate i destinatari della vostra patch
280-----------------------------------------------
281
282Dovreste sempre inviare una copia della patch ai manutentori dei sottosistemi
283interessati dalle modifiche; date un'occhiata al file MAINTAINERS e alla storia
284delle revisioni per scoprire chi si occupa del codice.  Lo script
285scripts/get_maintainer.pl può esservi d'aiuto.  Se non riuscite a trovare un
286manutentore per il sottosistema su cui state lavorando, allora Andrew Morton
287(akpm@linux-foundation.org) sarà la vostra ultima possibilità.
288
289Normalmente, dovreste anche scegliere una lista di discussione a cui inviare
290la vostra serie di patch.  La lista di discussione linux-kernel@vger.kernel.org
291è proprio l'ultima spiaggia, il volume di email su questa lista fa si che
292diversi sviluppatori non la seguano.  Guardate nel file MAINTAINERS per trovare
293la lista di discussione dedicata ad un sottosistema; probabilmente lì la vostra
294patch riceverà molta più attenzione.  Tuttavia, per favore, non spammate le
295liste di discussione che non sono interessate al vostro lavoro.
296
297Molte delle liste di discussione relative al kernel vengono ospitate su
298vger.kernel.org; potete trovare un loro elenco alla pagina
299http://vger.kernel.org/vger-lists.html.  Tuttavia, ci sono altre liste di
300discussione ospitate altrove.
301
302Non inviate più di 15 patch alla volta sulle liste di discussione vger!!!
303
304L'ultimo giudizio sull'integrazione delle modifiche accettate spetta a
305Linux Torvalds.  Il suo indirizzo e-mail è <torvalds@linux-foundation.org>.
306Riceve moltissime e-mail, e, a questo punto, solo poche patch passano
307direttamente attraverso il suo giudizio; quindi, dovreste fare del vostro
308meglio per -evitare di- inviargli e-mail.
309
310Se avete una patch che corregge un baco di sicurezza che potrebbe essere
311sfruttato, inviatela a security@kernel.org.  Per bachi importanti, un breve
312embargo potrebbe essere preso in considerazione per dare il tempo alle
313distribuzioni di prendere la patch e renderla disponibile ai loro utenti;
314in questo caso, ovviamente, la patch non dovrebbe essere inviata su alcuna
315lista di discussione pubblica.
316
317Patch che correggono bachi importanti su un kernel già rilasciato, dovrebbero
318essere inviate ai manutentori dei kernel stabili aggiungendo la seguente riga::
319
320  Cc: stable@vger.kernel.org
321
322nella vostra patch, nell'area dedicata alle firme (notate, NON come destinatario
323delle e-mail).  In aggiunta a questo file, dovreste leggere anche
324:ref:`Documentation/translations/it_IT/process/stable-kernel-rules.rst <it_stable_kernel_rules>`
325
326Tuttavia, notate, che alcuni manutentori di sottosistema preferiscono avere
327l'ultima parola su quali patch dovrebbero essere aggiunte ai kernel stabili.
328La rete di manutentori, in particolare, non vorrebbe vedere i singoli
329sviluppatori aggiungere alle loro patch delle righe come quella sopracitata.
330
331Se le modifiche hanno effetti sull'interfaccia con lo spazio utente, per favore
332inviate una patch per le pagine man ai manutentori di suddette pagine (elencati
333nel file MAINTAINERS), o almeno una notifica circa la vostra modifica,
334cosicché l'informazione possa trovare la sua strada nel manuale.  Le modifiche
335all'API dello spazio utente dovrebbero essere inviate in copia anche a
336linux-api@vger.kernel.org.
337
338Per le piccole patch potreste aggiungere in CC l'indirizzo
339*Trivial Patch Monkey trivial@kernel.org* che ha lo scopo di raccogliere
340le patch "banali".  Date uno sguardo al file MAINTAINERS per vedere chi
341è l'attuale amministratore.
342
343Le patch banali devono rientrare in una delle seguenti categorie:
344
345- errori grammaticali nella documentazione
346- errori grammaticali negli errori che potrebbero rompere :manpage:`grep(1)`
347- correzione di avvisi di compilazione (riempirsi di avvisi inutili è negativo)
348- correzione di errori di compilazione (solo se correggono qualcosa sul serio)
349- rimozione di funzioni/macro deprecate
350- sostituzione di codice non potabile con uno portabile (anche in codice
351  specifico per un'architettura, dato che le persone copiano, fintanto che
352  la modifica sia banale)
353- qualsiasi modifica dell'autore/manutentore di un file (in pratica
354  "patch monkey" in modalità ritrasmissione)
355
356
3576) Niente: MIME, links, compressione, allegati.  Solo puro testo
358----------------------------------------------------------------
359
360Linus e gli altri sviluppatori del kernel devono poter commentare
361le modifiche che sottomettete.  Per uno sviluppatore è importante
362essere in grado di "citare" le vostre modifiche, usando normali
363programmi di posta elettronica, cosicché sia possibile commentare
364una porzione specifica del vostro codice.
365
366Per questa ragione tutte le patch devono essere inviate via e-mail
367come testo.
368
369.. warning::
370
371  Se decidete di copiare ed incollare la patch nel corpo dell'e-mail, state
372  attenti che il vostro programma non corrompa il contenuto con andate
373  a capo automatiche.
374
375La patch non deve essere un allegato MIME, compresso o meno.  Molti
376dei più popolari programmi di posta elettronica non trasmettono un allegato
377MIME come puro testo, e questo rende impossibile commentare il vostro codice.
378Inoltre, un allegato MIME rende l'attività di Linus più laboriosa, diminuendo
379così la possibilità che il vostro allegato-MIME venga accettato.
380
381Eccezione: se il vostro servizio di posta storpia le patch, allora qualcuno
382potrebbe chiedervi di rinviarle come allegato MIME.
383
384Leggete :ref:`Documentation/translations/it_IT/process/email-clients.rst <it_email_clients>`
385per dei suggerimenti sulla configurazione del programmi di posta elettronica
386per l'invio di patch intatte.
387
3887) Dimensione delle e-mail
389--------------------------
390
391Le grosse modifiche non sono adatte ad una lista di discussione, e nemmeno
392per alcuni manutentori.  Se la vostra patch, non compressa, eccede i 300 kB
393di spazio, allora caricatela in una spazio accessibile su internet fornendo
394l'URL (collegamento) ad essa.  Ma notate che se la vostra patch eccede i 300 kB
395è quasi certo che necessiti comunque di essere spezzettata.
396
3978) Rispondere ai commenti di revisione
398--------------------------------------
399
400Quasi certamente i revisori vi invieranno dei commenti su come migliorare
401la vostra patch.  Dovete rispondere a questi commenti; ignorare i revisori
402è un ottimo modo per essere ignorati.  Riscontri o domande che non conducono
403ad una modifica del codice quasi certamente dovrebbero portare ad un commento
404nel changelog cosicché il prossimo revisore potrà meglio comprendere cosa stia
405accadendo.
406
407Assicuratevi di dire ai revisori quali cambiamenti state facendo e di
408ringraziarli per il loro tempo.  Revisionare codice è un lavoro faticoso e che
409richiede molto tempo, e a volte i revisori diventano burberi.  Tuttavia, anche
410in questo caso, rispondete con educazione e concentratevi sul problema che
411hanno evidenziato.
412
4139) Non scoraggiatevi - o impazientitevi
414---------------------------------------
415
416Dopo che avete inviato le vostre modifiche, siate pazienti e aspettate.
417I revisori sono persone occupate e potrebbero non ricevere la vostra patch
418immediatamente.
419
420Un tempo, le patch erano solite scomparire nel vuoto senza alcun commento,
421ma ora il processo di sviluppo funziona meglio.  Dovreste ricevere commenti
422in una settimana o poco più; se questo non dovesse accadere, assicuratevi di
423aver inviato le patch correttamente.  Aspettate almeno una settimana prima di
424rinviare le modifiche o sollecitare i revisori - probabilmente anche di più
425durante la finestra d'integrazione.
426
42710) Aggiungete PATCH nell'oggetto
428---------------------------------
429
430Dato l'alto volume di e-mail per Linus, e la lista linux-kernel, è prassi
431prefiggere il vostro oggetto con [PATCH].  Questo permette a Linus e agli
432altri sviluppatori del kernel di distinguere facilmente le patch dalle altre
433discussioni.
434
435
43611) Firmate il vostro lavoro - Il certificato d'origine dello sviluppatore
437--------------------------------------------------------------------------
438
439Per migliorare la tracciabilità su "chi ha fatto cosa", specialmente per
440quelle patch che per raggiungere lo stadio finale passano attraverso
441diversi livelli di manutentori, abbiamo introdotto la procedura di "firma"
442delle patch che vengono inviate per e-mail.
443
444La firma è una semplice riga alla fine della descrizione della patch che
445certifica che l'avete scritta voi o che avete il diritto di pubblicarla
446come patch open-source.  Le regole sono abbastanza semplici: se potete
447certificare quanto segue:
448
449Il certificato d'origine dello sviluppatore 1.1
450^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
451
452Contribuendo a questo progetto, io certifico che:
453
454        (a) Il contributo è stato creato interamente, o in parte, da me e che
455            ho il diritto di inviarlo in accordo con la licenza open-source
456            indicata nel file; oppure
457
458        (b) Il contributo è basato su un lavoro precedente che, nei limiti
459            della mia conoscenza, è coperto da un'appropriata licenza
460            open-source che mi da il diritto di modificarlo e inviarlo,
461            le cui modifiche sono interamente o in parte mie, in accordo con
462            la licenza open-source (a meno che non abbia il permesso di usare
463            un'altra licenza) indicata nel file; oppure
464
465        (c) Il contributo mi è stato fornito direttamente da qualcuno che
466            ha certificato (a), (b) o (c) e non l'ho modificata.
467
468        (d) Capisco e concordo col fatto che questo progetto e i suoi
469            contributi sono pubblici e che un registro dei contributi (incluse
470            tutte le informazioni personali che invio con essi, inclusa la mia
471            firma) verrà mantenuto indefinitamente e che possa essere
472            ridistribuito in accordo con questo progetto o le licenze
473            open-source coinvolte.
474
475poi dovete solo aggiungere una riga che dice::
476
477	Signed-off-by: Random J Developer <random@developer.example.org>
478
479usando il vostro vero nome (spiacenti, non si accettano pseudonimi o
480contributi anonimi).
481
482Alcune persone aggiungono delle etichette alla fine.  Per ora queste verranno
483ignorate, ma potete farlo per meglio identificare procedure aziendali interne o
484per aggiungere dettagli circa la firma.
485
486Se siete un manutentore di un sottosistema o di un ramo, qualche volta dovrete
487modificare leggermente le patch che avete ricevuto al fine di poterle
488integrare; questo perché il codice non è esattamente lo stesso nei vostri
489sorgenti e in quelli dei vostri contributori.  Se rispettate rigidamente la
490regola (c), dovreste chiedere al mittente di rifare la patch, ma questo è
491controproducente e una totale perdita di tempo ed energia.  La regola (b)
492vi permette di correggere il codice, ma poi diventa davvero maleducato cambiare
493la patch di qualcuno e addossargli la responsabilità per i vostri bachi.
494Per risolvere questo problema dovreste aggiungere una riga, fra l'ultimo
495Signed-off-by e il vostro, che spiega la vostra modifica.  Nonostante non ci
496sia nulla di obbligatorio, un modo efficace è quello di indicare il vostro
497nome o indirizzo email fra parentesi quadre, seguito da una breve descrizione;
498questo renderà abbastanza visibile chi è responsabile per le modifiche
499dell'ultimo minuto.  Per esempio::
500
501	Signed-off-by: Random J Developer <random@developer.example.org>
502	[lucky@maintainer.example.org: struct foo moved from foo.c to foo.h]
503	Signed-off-by: Lucky K Maintainer <lucky@maintainer.example.org>
504
505Questa pratica è particolarmente utile se siete i manutentori di un ramo
506stabile ma al contempo volete dare credito agli autori, tracciare e integrare
507le modifiche, e proteggere i mittenti dalle lamentele.  Notate che in nessuna
508circostanza è permessa la modifica dell'identità dell'autore (l'intestazione
509From), dato che è quella che appare nei changelog.
510
511Un appunto speciale per chi porta il codice su vecchie versioni.  Sembra che
512sia comune l'utile pratica di inserire un'indicazione circa l'origine della
513patch all'inizio del messaggio di commit (appena dopo la riga dell'oggetto)
514al fine di migliorare la tracciabilità.  Per esempio, questo è quello che si
515vede nel rilascio stabile 3.x-stable::
516
517  Date:   Tue Oct 7 07:26:38 2014 -0400
518
519    libata: Un-break ATA blacklist
520
521    commit 1c40279960bcd7d52dbdf1d466b20d24b99176c8 upstream.
522
523E qui quello che potrebbe vedersi su un kernel più vecchio dove la patch è
524stata applicata::
525
526    Date:   Tue May 13 22:12:27 2008 +0200
527
528        wireless, airo: waitbusy() won't delay
529
530        [backport of 2.6 commit b7acbdfbd1f277c1eb23f344f899cfa4cd0bf36a]
531
532Qualunque sia il formato, questa informazione fornisce un importante aiuto
533alle persone che vogliono seguire i vostri sorgenti, e quelle che cercano
534dei bachi.
535
536
53712) Quando utilizzare Acked-by:, Cc:, e Co-developed-by:
538--------------------------------------------------------
539
540L'etichetta Signed-off-by: indica che il firmatario è stato coinvolto nello
541sviluppo della patch, o che era nel suo percorso di consegna.
542
543Se una persona non è direttamente coinvolta con la preparazione o gestione
544della patch ma desidera firmare e mettere agli atti la loro approvazione,
545allora queste persone possono chiedere di aggiungere al changelog della patch
546una riga Acked-by:.
547
548Acked-by: viene spesso utilizzato dai manutentori del sottosistema in oggetto
549quando quello stesso manutentore non ha contribuito né trasmesso la patch.
550
551Acked-by: non è formale come Signed-off-by:.  Questo indica che la persona ha
552revisionato la patch e l'ha trovata accettabile.  Per cui, a volte, chi
553integra le patch convertirà un "sì, mi sembra che vada bene" in un Acked-by:
554(ma tenete presente che solitamente è meglio chiedere esplicitamente).
555
556Acked-by: non indica l'accettazione di un'intera patch.  Per esempio, quando
557una patch ha effetti su diversi sottosistemi e ha un Acked-by: da un
558manutentore di uno di questi, significa che il manutentore accetta quella
559parte di codice relativa al sottosistema che mantiene.  Qui dovremmo essere
560giudiziosi.  Quando si hanno dei dubbi si dovrebbe far riferimento alla
561discussione originale negli archivi della lista di discussione.
562
563Se una persona ha avuto l'opportunità di commentare la patch, ma non lo ha
564fatto, potete aggiungere l'etichetta ``Cc:`` alla patch.  Questa è l'unica
565etichetta che può essere aggiunta senza che la persona in questione faccia
566alcunché - ma dovrebbe indicare che la persona ha ricevuto una copia della
567patch.  Questa etichetta documenta che terzi potenzialmente interessati sono
568stati inclusi nella discussione.
569
570Co-developed-by: indica che la patch è stata cosviluppata da diversi
571sviluppatori; viene usato per assegnare più autori (in aggiunta a quello
572associato all'etichetta From:) quando più persone lavorano ad una patch.  Dato
573che Co-developed-by: implica la paternità della patch, ogni Co-developed-by:
574dev'essere seguito immediatamente dal Signed-off-by: del corrispondente
575coautore. Qui si applica la procedura di base per sign-off, in pratica
576l'ordine delle etichette Signed-off-by: dovrebbe riflettere il più possibile
577l'ordine cronologico della storia della patch, indipendentemente dal fatto che
578la paternità venga assegnata via From: o Co-developed-by:. Da notare che
579l'ultimo Signed-off-by: dev'essere quello di colui che ha sottomesso la patch.
580
581Notate anche che l'etichetta From: è opzionale quando l'autore in From: è
582anche la persona (e indirizzo email) indicato nel From: dell'intestazione
583dell'email.
584
585Esempio di una patch sottomessa dall'autore in From:::
586
587	<changelog>
588
589	Co-developed-by: First Co-Author <first@coauthor.example.org>
590	Signed-off-by: First Co-Author <first@coauthor.example.org>
591	Co-developed-by: Second Co-Author <second@coauthor.example.org>
592	Signed-off-by: Second Co-Author <second@coauthor.example.org>
593	Signed-off-by: From Author <from@author.example.org>
594
595Esempio di una patch sottomessa dall'autore Co-developed-by:::
596
597	From: From Author <from@author.example.org>
598
599	<changelog>
600
601	Co-developed-by: Random Co-Author <random@coauthor.example.org>
602	Signed-off-by: Random Co-Author <random@coauthor.example.org>
603	Signed-off-by: From Author <from@author.example.org>
604	Co-developed-by: Submitting Co-Author <sub@coauthor.example.org>
605	Signed-off-by: Submitting Co-Author <sub@coauthor.example.org>
606
60713) Utilizzare Reported-by:, Tested-by:, Reviewed-by:, Suggested-by: e Fixes:
608-----------------------------------------------------------------------------
609
610L'etichetta Reported-by da credito alle persone che trovano e riportano i bachi
611e si spera che questo possa ispirarli ad aiutarci nuovamente in futuro.
612Rammentate che se il baco è stato riportato in privato, dovrete chiedere il
613permesso prima di poter utilizzare l'etichetta Reported-by.
614
615L'etichetta Tested-by: indica che la patch è stata verificata con successo
616(su un qualche sistema) dalla persona citata.  Questa etichetta informa i
617manutentori che qualche verifica è stata fatta, fornisce un mezzo per trovare
618persone che possano verificare il codice in futuro, e garantisce che queste
619stesse persone ricevano credito per il loro lavoro.
620
621Reviewd-by:, invece, indica che la patch è stata revisionata ed è stata
622considerata accettabile in accordo con la dichiarazione dei revisori:
623
624Dichiarazione di svista dei revisori
625^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
626
627Offrendo la mia etichetta Reviewed-by, dichiaro quanto segue:
628
629	 (a) Ho effettuato una revisione tecnica di questa patch per valutarne
630	     l'adeguatezza ai fini dell'inclusione nel ramo principale del
631	     kernel.
632
633	 (b) Tutti i problemi e le domande riguardanti la patch sono stati
634	     comunicati al mittente.  Sono soddisfatto dalle risposte
635	     del mittente.
636
637	 (c) Nonostante ci potrebbero essere cose migliorabili in queste
638	     sottomissione, credo che sia, in questo momento, (1) una modifica
639	     di interesse per il kernel, e (2) libera da problemi che
640	     potrebbero metterne in discussione l'integrazione.
641
642	 (d) Nonostante abbia revisionato la patch e creda che vada bene,
643	     non garantisco (se non specificato altrimenti) che questa
644	     otterrà quello che promette o funzionerà correttamente in tutte
645	     le possibili situazioni.
646
647L'etichetta Reviewed-by è la dichiarazione di un parere sulla bontà di
648una modifica che si ritiene appropriata e senza alcun problema tecnico
649importante.  Qualsiasi revisore interessato (quelli che lo hanno fatto)
650possono offrire il proprio Reviewed-by per la patch.  Questa etichetta serve
651a dare credito ai revisori e a informare i manutentori sul livello di revisione
652che è stato fatto sulla patch.  L'etichetta Reviewd-by, quando fornita da
653revisori conosciuti per la loro conoscenza sulla materia in oggetto e per la
654loro serietà nella revisione, accrescerà le probabilità che la vostra patch
655venga integrate nel kernel.
656
657L'etichetta Suggested-by: indica che l'idea della patch è stata suggerita
658dalla persona nominata e le da credito. Tenete a mente che questa etichetta
659non dovrebbe essere aggiunta senza un permesso esplicito, specialmente se
660l'idea non è stata pubblicata in un forum pubblico.  Detto ciò, dando credito
661a chi ci fornisce delle idee, si spera di poterli ispirare ad aiutarci
662nuovamente in futuro.
663
664L'etichetta Fixes: indica che la patch corregge un problema in un commit
665precedente.  Serve a chiarire l'origine di un baco, il che aiuta la revisione
666del baco stesso.  Questa etichetta è di aiuto anche per i manutentori dei
667kernel stabili al fine di capire quale kernel deve ricevere la correzione.
668Questo è il modo suggerito per indicare che un baco è stato corretto nella
669patch. Per maggiori dettagli leggete :ref:`it_describe_changes`
670
671
67214) Il formato canonico delle patch
673-----------------------------------
674
675Questa sezione descrive il formato che dovrebbe essere usato per le patch.
676Notate che se state usando un repositorio ``git`` per salvare le vostre patch
677potere usare il comando ``git format-patch`` per ottenere patch nel formato
678appropriato.  Lo strumento non crea il testo necessario, per cui, leggete
679le seguenti istruzioni.
680
681L'oggetto di una patch canonica è la riga::
682
683    Subject: [PATCH 001/123] subsystem: summary phrase
684
685Il corpo di una patch canonica contiene i seguenti elementi:
686
687  - Una riga ``from`` che specifica l'autore della patch, seguita
688    da una riga vuota (necessaria soltanto se la persona che invia la
689    patch non ne è l'autore).
690
691  - Il corpo della spiegazione, con linee non più lunghe di 75 caratteri,
692    che verrà copiato permanentemente nel changelog per descrivere la patch.
693
694  - Una riga vuota
695
696  - Le righe ``Signed-off-by:``, descritte in precedenza, che finiranno
697    anch'esse nel changelog.
698
699  - Una linea di demarcazione contenente semplicemente ``---``.
700
701  - Qualsiasi altro commento che non deve finire nel changelog.
702
703  - Le effettive modifiche al codice (il prodotto di ``diff``).
704
705Il formato usato per l'oggetto permette ai programmi di posta di usarlo
706per ordinare le patch alfabeticamente - tutti i programmi di posta hanno
707questa funzionalità - dato che al numero sequenziale si antepongono degli zeri;
708in questo modo l'ordine numerico ed alfabetico coincidono.
709
710Il ``subsystem`` nell'oggetto dell'email dovrebbe identificare l'area
711o il sottosistema modificato dalla patch.
712
713La ``summary phrase`` nell'oggetto dell'email dovrebbe descrivere brevemente
714il contenuto della patch.  La ``summary phrase`` non dovrebbe essere un nome
715di file. Non utilizzate la stessa ``summary phrase`` per tutte le patch in
716una serie (dove una ``serie di patch`` è una sequenza ordinata di diverse
717patch correlate).
718
719Ricordatevi che la ``summary phrase`` della vostra email diventerà un
720identificatore globale ed unico per quella patch.  Si propaga fino al
721changelog ``git``.  La ``summary phrase`` potrà essere usata in futuro
722dagli sviluppatori per riferirsi a quella patch.  Le persone vorranno
723cercare la ``summary phrase`` su internet per leggere le discussioni che la
724riguardano.  Potrebbe anche essere l'unica cosa che le persone vedranno
725quando, in due o tre mesi, riguarderanno centinaia di patch usando strumenti
726come ``gitk`` o ``git log --oneline``.
727
728Per queste ragioni, dovrebbe essere lunga fra i 70 e i 75 caratteri, e deve
729descrivere sia cosa viene modificato, sia il perché sia necessario. Essere
730brevi e descrittivi è una bella sfida, ma questo è quello che fa un riassunto
731ben scritto.
732
733La ``summary phrase`` può avere un'etichetta (*tag*) di prefisso racchiusa fra
734le parentesi quadre "Subject: [PATCH <tag>...] <summary phrase>".
735Le etichette non verranno considerate come parte della frase riassuntiva, ma
736indicano come la patch dovrebbe essere trattata.  Fra le etichette più comuni
737ci sono quelle di versione che vengono usate quando una patch è stata inviata
738più volte (per esempio, "v1, v2, v3"); oppure "RFC" per indicare che si
739attendono dei commenti (*Request For Comments*).  Se ci sono quattro patch
740nella serie, queste dovrebbero essere enumerate così: 1/4, 2/4, 3/4, 4/4.
741Questo assicura che gli sviluppatori capiranno l'ordine in cui le patch
742dovrebbero essere applicate, e per tracciare quelle che hanno revisionate o
743che hanno applicato.
744
745Un paio di esempi di oggetti::
746
747    Subject: [PATCH 2/5] ext2: improve scalability of bitmap searching
748    Subject: [PATCH v2 01/27] x86: fix eflags tracking
749
750La riga ``from`` dev'essere la prima nel corpo del messaggio ed è nel
751formato:
752
753        From: Patch Author <author@example.com>
754
755La riga ``from`` indica chi verrà accreditato nel changelog permanente come
756l'autore della patch.  Se la riga ``from`` è mancante, allora per determinare
757l'autore da inserire nel changelog verrà usata la riga ``From``
758nell'intestazione dell'email.
759
760Il corpo della spiegazione verrà incluso nel changelog permanente, per cui
761deve aver senso per un lettore esperto che è ha dimenticato i dettagli della
762discussione che hanno portato alla patch.  L'inclusione di informazioni
763sui problemi oggetto dalla patch (messaggi del kernel, messaggi di oops,
764eccetera) è particolarmente utile per le persone che potrebbero cercare fra
765i messaggi di log per la patch che li tratta.  Se la patch corregge un errore
766di compilazione, non sarà necessario includere proprio _tutto_ quello che
767è uscito dal compilatore; aggiungete solo quello che è necessario per far si
768che la vostra patch venga trovata.  Come nella ``summary phrase``, è importante
769essere sia brevi che descrittivi.
770
771La linea di demarcazione ``---`` serve essenzialmente a segnare dove finisce
772il messaggio di changelog.
773
774Aggiungere il ``diffstat`` dopo ``---`` è un buon uso di questo spazio, per
775mostrare i file che sono cambiati, e il numero di file aggiunto o rimossi.
776Un ``diffstat`` è particolarmente utile per le patch grandi.  Altri commenti
777che sono importanti solo per i manutentori, quindi inadatti al changelog
778permanente, dovrebbero essere messi qui.  Un buon esempio per questo tipo
779di commenti potrebbe essere quello di descrivere le differenze fra le versioni
780della patch.
781
782Se includete un ``diffstat`` dopo ``---``, usate le opzioni ``-p 1 -w70``
783cosicché i nomi dei file elencati non occupino troppo spazio (facilmente
784rientreranno negli 80 caratteri, magari con qualche indentazione).
785(``git`` genera di base dei diffstat adatti).
786
787Maggiori dettagli sul formato delle patch nei riferimenti qui di seguito.
788
789.. _it_explicit_in_reply_to:
790
79115) Usare esplicitamente In-Reply-To nell'intestazione
792------------------------------------------------------
793
794Aggiungere manualmente In-Reply-To: nell'intestazione dell'e-mail
795potrebbe essere d'aiuto per associare una patch ad una discussione
796precedente, per esempio per collegare la correzione di un baco con l'e-mail
797che lo riportava.  Tuttavia, per serie di patch multiple è generalmente
798sconsigliato l'uso di In-Reply-To: per collegare precedenti versioni.
799In questo modo versioni multiple di una patch non diventeranno un'ingestibile
800giungla di riferimenti all'interno dei programmi di posta.  Se un collegamento
801è utile, potete usare https://lkml.kernel.org/ per ottenere i collegamenti
802ad una versione precedente di una serie di patch (per esempio, potete usarlo
803per l'email introduttiva alla serie).
804
80516) Inviare richieste ``git pull``
806----------------------------------
807
808Se avete una serie di patch, potrebbe essere più conveniente per un manutentore
809tirarle dentro al repositorio del sottosistema attraverso l'operazione
810``git pull``.  Comunque, tenete presente che prendere patch da uno sviluppatore
811in questo modo richiede un livello di fiducia più alto rispetto a prenderle da
812una lista di discussione.  Di conseguenza, molti manutentori sono riluttanti
813ad accettare richieste di *pull*, specialmente dagli sviluppatori nuovi e
814quindi sconosciuti.  Se siete in dubbio, potete fare una richiesta di *pull*
815come messaggio introduttivo ad una normale pubblicazione di patch, così
816il manutentore avrà la possibilità di scegliere come integrarle.
817
818Una richiesta di *pull* dovrebbe avere nell'oggetto [GIT] o [PULL].
819La richiesta stessa dovrebbe includere il nome del repositorio e quello del
820ramo su una singola riga; dovrebbe essere più o meno così::
821
822  Please pull from
823
824      git://jdelvare.pck.nerim.net/jdelvare-2.6 i2c-for-linus
825
826  to get these changes:
827
828Una richiesta di *pull* dovrebbe includere anche un messaggio generico
829che dica cos'è incluso, una lista delle patch usando ``git shortlog``, e una
830panoramica sugli effetti della serie di patch con ``diffstat``.  Il modo più
831semplice per ottenere tutte queste informazioni è, ovviamente, quello di
832lasciar fare tutto a ``git`` con il comando ``git request-pull``.
833
834Alcuni manutentori (incluso Linus) vogliono vedere le richieste di *pull*
835da commit firmati con GPG; questo fornisce una maggiore garanzia sul fatto
836che siate stati proprio voi a fare la richiesta.  In assenza di tale etichetta
837firmata Linus, in particolare, non prenderà alcuna patch da siti pubblici come
838GitHub.
839
840Il primo passo verso la creazione di questa etichetta firmata è quello di
841creare una chiave GNUPG ed averla fatta firmare da uno o più sviluppatori
842principali del kernel.  Questo potrebbe essere difficile per i nuovi
843sviluppatori, ma non ci sono altre vie.  Andare alle conferenze potrebbe
844essere un buon modo per trovare sviluppatori che possano firmare la vostra
845chiave.
846
847Una volta che avete preparato la vostra serie di patch in ``git``, e volete che
848qualcuno le prenda, create una etichetta firmata col comando ``git tag -s``.
849Questo creerà una nuova etichetta che identifica l'ultimo commit della serie
850contenente una firma creata con la vostra chiave privata.  Avrete anche
851l'opportunità di aggiungere un messaggio di changelog all'etichetta; questo è
852il posto ideale per descrivere gli effetti della richiesta di *pull*.
853
854Se i sorgenti da cui il manutentore prenderà le patch non sono gli stessi del
855repositorio su cui state lavorando, allora non dimenticatevi di caricare
856l'etichetta firmata anche sui sorgenti pubblici.
857
858Quando generate una richiesta di *pull*, usate l'etichetta firmata come
859obiettivo.  Un comando come il seguente farà il suo dovere::
860
861  git request-pull master git://my.public.tree/linux.git my-signed-tag
862
863
864Riferimenti
865-----------
866
867Andrew Morton, "La patch perfetta" (tpp).
868  <http://www.ozlabs.org/~akpm/stuff/tpp.txt>
869
870Jeff Garzik, "Formato per la sottomissione di patch per il kernel Linux"
871  <https://web.archive.org/web/20180829112450/http://linux.yyz.us/patch-format.html>
872
873Greg Kroah-Hartman, "Come scocciare un manutentore di un sottosistema"
874  <http://www.kroah.com/log/linux/maintainer.html>
875
876  <http://www.kroah.com/log/linux/maintainer-02.html>
877
878  <http://www.kroah.com/log/linux/maintainer-03.html>
879
880  <http://www.kroah.com/log/linux/maintainer-04.html>
881
882  <http://www.kroah.com/log/linux/maintainer-05.html>
883
884  <http://www.kroah.com/log/linux/maintainer-06.html>
885
886No!!!! Basta gigantesche bombe patch alle persone sulla lista linux-kernel@vger.kernel.org!
887  <https://lkml.org/lkml/2005/7/11/336>
888
889Kernel Documentation/translations/it_IT/process/coding-style.rst:
890  :ref:`Documentation/translations/it_IT/process/coding-style.rst <it_codingstyle>`
891
892E-mail di Linus Torvalds sul formato canonico di una patch:
893  <http://lkml.org/lkml/2005/4/7/183>
894
895Andi Kleen, "Su come sottomettere patch del kernel"
896  Alcune strategie su come sottomettere modifiche toste o controverse.
897
898  http://halobates.de/on-submitting-patches.pdf
899