1.. include:: ../disclaimer-ita.rst 2 3:Original: :ref:`Documentation/process/5.Posting.rst <development_posting>` 4:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 5 6.. _it_development_posting: 7 8Pubblicare modifiche 9==================== 10 11Prima o poi arriva il momento in cui il vostro lavoro è pronto per essere 12presentato alla comunità per una revisione ed eventualmente per la sua 13inclusione nel ramo principale del kernel. Com'era prevedibile, 14la comunità di sviluppo del kernel ha elaborato un insieme di convenzioni 15e di procedure per la pubblicazione delle patch; seguirle renderà la vita 16più facile a tutti quanti. Questo documento cercherà di coprire questi 17argomenti con un ragionevole livello di dettaglio; più informazioni possono 18essere trovare nella cartella 'Documentation', nei file 19:ref:`translations/it_IT/process/submitting-patches.rst <it_submittingpatches>` 20e :ref:`translations/it_IT/process/submit-checklist.rst <it_submitchecklist>`. 21 22 23Quando pubblicarle 24------------------ 25 26C'è sempre una certa resistenza nel pubblicare patch finché non sono 27veramente "pronte". Per semplici patch questo non è un problema. 28Ma quando il lavoro è di una certa complessità, c'è molto da guadagnare 29dai riscontri che la comunità può darvi prima che completiate il lavoro. 30Dovreste considerare l'idea di pubblicare un lavoro incompleto, o anche 31preparare un ramo git disponibile agli sviluppatori interessati, cosicché 32possano stare al passo col vostro lavoro in qualunque momento. 33 34Quando pubblicate del codice che non è considerato pronto per l'inclusione, 35è bene che lo diciate al momento della pubblicazione. Inoltre, aggiungete 36informazioni sulle cose ancora da sviluppare e sui problemi conosciuti. 37Poche persone guarderanno delle patch che si sa essere fatte a metà, 38ma quelli che lo faranno penseranno di potervi aiutare a condurre il vostro 39sviluppo nella giusta direzione. 40 41 42Prima di creare patch 43--------------------- 44 45Ci sono un certo numero di cose che dovreste fare prima di considerare 46l'invio delle patch alla comunità di sviluppo. Queste cose includono: 47 48 - Verificare il codice fino al massimo che vi è consentito. Usate gli 49 strumenti di debug del kernel, assicuratevi che il kernel compili con 50 tutte le più ragionevoli combinazioni d'opzioni, usate cross-compilatori 51 per compilare il codice per differenti architetture, eccetera. Aggiungete 52 dei test, preferibilmente usando un framework di test già esistente come 53 KUnit, e includeteli come un elemento separato della vostra serie (per 54 maggiori informazioni sulle serie di patch, vedere la sezione successiva). 55 Da notare che questo può essere obbligatorio quando si toccano alcuni 56 sottosistemi. Per esempio, le funzioni di libreria (che risiedono in 57 lib/) sono usate estensivamente quasi ovunque, e ci si aspetta che siano 58 testate adeguatamente. 59 60 - Assicuratevi che il vostro codice sia conforme alla linee guida del 61 kernel sullo stile del codice. 62 63 - La vostra patch ha delle conseguenze in termini di prestazioni? 64 Se è così, dovreste eseguire dei *benchmark* che mostrino il loro 65 impatto (anche positivo); un riassunto dei risultati dovrebbe essere 66 incluso nella patch. 67 68 - Siate certi d'avere i diritti per pubblicare il codice. Se questo 69 lavoro è stato fatto per un datore di lavoro, egli avrà dei diritti su 70 questo lavoro e dovrà quindi essere d'accordo alla sua pubblicazione 71 con una licenza GPL 72 73Come regola generale, pensarci un po' di più prima di inviare il codice 74ripaga quasi sempre lo sforzo. 75 76 77Preparazione di una patch 78------------------------- 79 80La preparazione delle patch per la pubblicazione può richiedere una quantità 81di lavoro significativa, ma, ripetiamolo ancora, generalmente sconsigliamo 82di risparmiare tempo in questa fase, anche sul breve periodo. 83 84Le patch devono essere preparate per una specifica versione del kernel. 85Come regola generale, una patch dovrebbe basarsi sul ramo principale attuale 86così come lo si trova nei sorgenti git di Linus. Quando vi basate sul ramo 87principale, cominciate da un punto di rilascio ben noto - uno stabile o 88un -rc - piuttosto che creare il vostro ramo da quello principale in un punto 89a caso. 90 91Per facilitare una revisione e una verifica più estesa, potrebbe diventare 92necessaria la produzione di versioni per -mm, linux-next o i sorgenti di un 93sottosistema. Basare questa patch sui suddetti sorgenti potrebbe richiedere 94un lavoro significativo nella risoluzione dei conflitti e nella correzione dei 95cambiamenti di API; questo potrebbe variare a seconda dell'area d'interesse 96della vostra patch e da quello che succede altrove nel kernel. 97 98Solo le modifiche più semplici dovrebbero essere preparate come una singola 99patch; tutto il resto dovrebbe essere preparato come una serie logica di 100modifiche. Spezzettare le patch è un po' un'arte; alcuni sviluppatori 101passano molto tempo nel capire come farlo in modo che piaccia alla comunità. 102Ci sono alcune regole spannometriche, che comunque possono aiutare 103considerevolmente: 104 105 - La serie di patch che pubblicherete, quasi sicuramente, non sarà 106 come quella che trovate nel vostro sistema di controllo di versione. 107 Invece, le vostre modifiche dovranno essere considerate nella loro forma 108 finale, e quindi separate in parti che abbiano un senso. Gli sviluppatori 109 sono interessati in modifiche che siano discrete e indipendenti, non 110 alla strada che avete percorso per ottenerle. 111 112 - Ogni modifica logicamente indipendente dovrebbe essere preparata come una 113 patch separata. Queste modifiche possono essere piccole ("aggiunto un 114 campo in questa struttura") o grandi (l'aggiunta di un driver nuovo, 115 per esempio), ma dovrebbero essere concettualmente piccole da permettere 116 una descrizione in una sola riga. Ogni patch dovrebbe fare modifiche 117 specifiche che si possano revisionare indipendentemente e di cui si possa 118 verificare la veridicità. 119 120 - Giusto per riaffermare quando detto sopra: non mischiate diversi tipi di 121 modifiche nella stessa patch. Se una modifica corregge un baco critico 122 per la sicurezza, riorganizza alcune strutture, e riformatta il codice, 123 ci sono buone probabilità che venga ignorata e che la correzione importante 124 venga persa. 125 126 - Ogni modifica dovrebbe portare ad un kernel che compila e funziona 127 correttamente; se la vostra serie di patch si interrompe a metà il 128 risultato dovrebbe essere comunque un kernel funzionante. L'applicazione 129 parziale di una serie di patch è uno scenario comune nel quale il 130 comando "git bisect" viene usato per trovare delle regressioni; se il 131 risultato è un kernel guasto, renderete la vita degli sviluppatori più 132 difficile così come quella di chi s'impegna nel nobile lavoro di 133 scovare i problemi. 134 135 - Però, non strafate. Una volta uno sviluppatore pubblicò una serie di 500 136 patch che modificavano un unico file - un atto che non lo rese la persona 137 più popolare sulla lista di discussione del kernel. Una singola patch 138 può essere ragionevolmente grande fintanto che contenga un singolo 139 cambiamento *logico*. 140 141 - Potrebbe essere allettante l'idea di aggiungere una nuova infrastruttura 142 come una serie di patch, ma di lasciare questa infrastruttura inutilizzata 143 finché l'ultima patch della serie non abilita tutto quanto. Quando è 144 possibile, questo dovrebbe essere evitato; se questa serie aggiunge delle 145 regressioni, "bisect" indicherà quest'ultima patch come causa del 146 problema anche se il baco si trova altrove. Possibilmente, quando una 147 patch aggiunge del nuovo codice dovrebbe renderlo attivo immediatamente. 148 149Lavorare per creare la serie di patch perfetta potrebbe essere frustrante 150perché richiede un certo tempo e soprattutto dopo che il "vero lavoro" è 151già stato fatto. Quando ben fatto, comunque, è tempo ben speso. 152 153 154Formattazione delle patch e i changelog 155--------------------------------------- 156 157Quindi adesso avete una serie perfetta di patch pronte per la pubblicazione, 158ma il lavoro non è davvero finito. Ogni patch deve essere preparata con 159un messaggio che spieghi al resto del mondo, in modo chiaro e veloce, 160il suo scopo. Per ottenerlo, ogni patch sarà composta dai seguenti elementi: 161 162 - Un campo opzionale "From" col nome dell'autore della patch. Questa riga 163 è necessaria solo se state passando la patch di qualcun altro via email, 164 ma nel dubbio non fa di certo male aggiungerlo. 165 166 - Una descrizione di una riga che spieghi cosa fa la patch. Questo 167 messaggio dovrebbe essere sufficiente per far comprendere al lettore lo 168 scopo della patch senza altre informazioni. Questo messaggio, 169 solitamente, presenta in testa il nome del sottosistema a cui si riferisce, 170 seguito dallo scopo della patch. Per esempio: 171 172 :: 173 174 gpio: fix build on CONFIG_GPIO_SYSFS=n 175 176 - Una riga bianca seguita da una descrizione dettagliata della patch. 177 Questa descrizione può essere lunga tanto quanto serve; dovrebbe spiegare 178 cosa fa e perché dovrebbe essere aggiunta al kernel. 179 180 - Una o più righe etichette, con, minimo, una riga *Signed-off-by:* 181 col nome dall'autore della patch. Queste etichette verranno descritte 182 meglio più avanti. 183 184Gli elementi qui sopra, assieme, formano il changelog di una patch. 185Scrivere un buon changelog è cruciale ma è spesso un'arte trascurata; 186vale la pena spendere qualche parola in più al riguardo. Quando scrivete 187un changelog dovreste tenere ben presente che molte persone leggeranno 188le vostre parole. Queste includono i manutentori di un sotto-sistema, e i 189revisori che devono decidere se la patch debba essere inclusa o no, 190le distribuzioni e altri manutentori che cercano di valutare se la patch 191debba essere applicata su kernel più vecchi, i cacciatori di bachi che si 192chiederanno se la patch è la causa di un problema che stanno cercando, 193gli utenti che vogliono sapere com'è cambiato il kernel, e molti altri. 194Un buon changelog fornisce le informazioni necessarie a tutte queste 195persone nel modo più diretto e conciso possibile. 196 197A questo scopo, la riga riassuntiva dovrebbe descrivere gli effetti della 198modifica e la motivazione della patch nel modo migliore possibile nonostante 199il limite di una sola riga. La descrizione dettagliata può spiegare meglio 200i temi e fornire maggiori informazioni. Se una patch corregge un baco, 201citate, se possibile, il commit che lo introdusse (e per favore, quando 202citate un commit aggiungete sia il suo identificativo che il titolo), 203Se il problema è associabile ad un file di log o all' output del compilatore, 204includeteli al fine d'aiutare gli altri a trovare soluzioni per lo stesso 205problema. Se la modifica ha lo scopo di essere di supporto a sviluppi 206successivi, ditelo. Se le API interne vengono cambiate, dettagliate queste 207modifiche e come gli altri dovrebbero agire per applicarle. In generale, 208più riuscirete ad entrare nei panni di tutti quelli che leggeranno il 209vostro changelog, meglio sarà il changelog (e il kernel nel suo insieme). 210 211Non serve dirlo, un changelog dovrebbe essere il testo usato nel messaggio 212di commit in un sistema di controllo di versione. Sarà seguito da: 213 214 - La patch stessa, nel formato unificato per patch ("-u"). Usare 215 l'opzione "-p" assocerà alla modifica il nome della funzione alla quale 216 si riferisce, rendendo il risultato più facile da leggere per gli altri. 217 218Le etichette sopracitate danno un'idea di come una patch prende vita e sono 219descritte nel dettaglio nel documento 220:ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`. 221Qui di seguito un breve riassunto. 222 223Un'etichetta ci può dire quale commit ha introdotto il problema che viene corretto nella patch:: 224 225 Fixes: 1f2e3d4c5b6a ("The first line of the commit specified by the first 12 characters of its SHA-1 ID") 226 227Un'altra etichetta viene usata per fornire collegamenti a pagine web contenenti 228maggiori informazioni, per esempio una discussione avvenuta precedentemente 229circa il baco risolto dalla patch, oppure un documento con le specifiche 230implementate dalla patch:: 231 232 Link: https://example.com/somewhere.html optional-other-stuff 233 234Come indicato dal "Chief Penguin" (soprannome di Linus Torvalds), un'etichetta 235Link: dovrebbe essere aggiunta ad un commit solo se conduce a informazioni 236utili che non si trovano già nel commit stesso. 237 238 239Se il collegamento indirizza verso un rapporto su un baco risolto dalla patch, 240allora usate l'etichetta "Closes:":: 241 242 Closes: https://example.com/issues/1234 optional-other-stuff 243 244Alcune piattaforme di tracciamento di bachi hanno la capacità di chiudere 245automaticamente il problema se l'etichetta è presente nel messaggio. Alcuni 246automatismi che monitorano la liste di discussione possono anche tracciare 247queste etichette e intraprendere azioni. Piattaforme private e URL invalidi sono 248proibiti. 249 250Un altro tipo di etichetta viene usato per indicare chi ha contribuito allo 251sviluppo della patch. Tutte queste etichette seguono il formato:: 252 253 tag: Full Name <email address> optional-other-stuff 254 255Le etichette in uso più comuni sono: 256 257 - Signed-off-by: questa è la certificazione che lo sviluppatore ha il diritto 258 di sottomettere la patch per l'integrazione nel kernel. Questo rappresenta 259 il consenso verso il certificato d'origine degli sviluppatori, il testo 260 completo potrà essere trovato in 261 :ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`. 262 Codice che non presenta una firma appropriata non potrà essere integrato. 263 264 - Co-developed-by: indica che la patch è stata cosviluppata da diversi 265 sviluppatori; viene usato per assegnare più autori (in aggiunta a quello 266 associato all'etichetta From:) quando più persone lavorano ad una patch. 267 Ogni Co-developed-by: dev'essere seguito immediatamente da un Signed-off-by: 268 del corrispondente coautore. Maggiori dettagli ed esempi sono disponibili 269 in :ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`. 270 271 - Acked-by: indica il consenso di un altro sviluppatore (spesso il manutentore 272 del codice in oggetto) all'integrazione della patch nel kernel. 273 274 - Tested-by: menziona la persona che ha verificato la patch e l'ha trovata 275 funzionante. 276 277 - Reviwed-by: menziona lo sviluppatore che ha revisionato la patch; per 278 maggiori dettagli leggete la dichiarazione dei revisori in 279 :ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>` 280 281 - Reported-by: menziona l'utente che ha riportato il problema corretto da 282 questa patch; quest'etichetta viene usata per dare credito alle persone che 283 hanno verificato il codice e ci hanno fatto sapere quando le cose non 284 funzionavano correttamente. Questa etichetta dovrebbe essere seguita da 285 quella Closes: con un indirizzo al rapporto, a meno che questo non sia 286 disponibile sul web. L'etichetta Link: può essere usata in alternativa a 287 Closes: se la patch corregge solo in parte il problema riportato nel 288 rapporto. 289 290 Se esiste un rapporto disponibile sul web, allora 291 L'etichetta dovrebbe essere seguita da un collegamento al suddetto rapporto. 292 293 - Suggested-by: indica che l'idea della patch è stata suggerita dalla persona 294 menzionata, ed assicura che le venga dato credito per l'idea. Questo, si 295 spera, la inviterà ad aiutarci ancora in futuro. 296 297 - Cc: la persona menzionata ha ricevuto una copia della patch ed ha avuto 298 l'opportunità di commentarla. 299 300State attenti ad aggiungere le suddette etichette alla vostra patch: tutte, 301tranne Cc:, Reported-by: e Suggested-by:, richiedono il permesso esplicito 302della persona menzionata. Per queste tre è sufficiente un permesso implicito, 303se la persona ha contribuito al kernel Linux usando quel nome e quell'indirizzo 304email secondo gli archivi di lore o la cronologia dei commit -- e, nel caso di 305Reported-by: e Suggested-by:, se la segnalazione o il suggerimento sono 306avvenuti pubblicamente. Da notare che bugzilla.kernel.org è, in questo senso, 307un luogo pubblico, ma gli indirizzi email usati lì sono privati; quindi non 308esponeteli nelle etichette, a meno che la persona non li abbia già usati in 309contributi precedenti. 310 311Inviare la modifica 312------------------- 313 314Prima di inviare la vostra patch, ci sarebbero ancora un paio di cose di cui 315dovreste aver cura: 316 317 - Siete sicuri che il vostro programma di posta non corromperà le patch? 318 Le patch che hanno spazi bianchi in libertà o andate a capo aggiunti 319 dai programmi di posta non funzioneranno per chi le riceve, e spesso 320 non verranno nemmeno esaminate in dettaglio. Se avete un qualsiasi dubbio, 321 inviate la patch a voi stessi e verificate che sia integra. 322 323 :ref:`Documentation/translations/it_IT/process/email-clients.rst <it_email_clients>` 324 contiene alcuni suggerimenti utili sulla configurazione dei programmi 325 di posta al fine di inviare patch. 326 327 - Siete sicuri che la vostra patch non contenga sciocchi errori? Dovreste 328 sempre processare le patch con scripts/checkpatch.pl e correggere eventuali 329 problemi riportati. Per favore tenete ben presente che checkpatch.pl non è 330 più intelligente di voi, nonostante sia il risultato di un certa quantità di 331 ragionamenti su come debba essere una patch per il kernel. Se seguire 332 i suggerimenti di checkpatch.pl rende il codice peggiore, allora non fatelo. 333 334Le patch dovrebbero essere sempre inviate come testo puro. Per favore non 335inviatele come allegati; questo rende molto più difficile, per i revisori, 336citare parti della patch che si vogliono commentare. Invece, mettete la vostra 337patch direttamente nel messaggio. 338 339Quando inviate le patch, è importante inviarne una copia a tutte le persone che 340potrebbero esserne interessate. Al contrario di altri progetti, il kernel 341incoraggia le persone a peccare nell'invio di tante copie; non presumente che 342le persone interessate vedano i vostri messaggi sulla lista di discussione. 343In particolare le copie dovrebbero essere inviate a: 344 345 - I manutentori dei sottosistemi affetti della modifica. Come descritto 346 in precedenza, il file MAINTAINERS è il primo luogo dove cercare i nomi 347 di queste persone. 348 349 - Altri sviluppatori che hanno lavorato nello stesso ambiente - specialmente 350 quelli che potrebbero lavorarci proprio ora. Usate git potrebbe essere 351 utile per vedere chi altri ha modificato i file su cui state lavorando. 352 353 - Se state rispondendo a un rapporto su un baco, o a una richiesta di 354 funzionalità, includete anche gli autori di quei rapporti/richieste. 355 356 - Inviate una copia alle liste di discussione interessate, o, se nient'altro 357 è adatto, alla lista linux-kernel 358 359 - Se state correggendo un baco, pensate se la patch dovrebbe essere inclusa 360 nel prossimo rilascio stabile. Se è così, la lista di discussione 361 stable@vger.kernel.org dovrebbe riceverne una copia. Aggiungete anche 362 l'etichetta "Cc: stable@vger.kernel.org" nella patch stessa; questo 363 permetterà alla squadra *stable* di ricevere una notifica quando questa 364 correzione viene integrata nel ramo principale. 365 366Quando scegliete i destinatari della patch, è bene avere un'idea di chi 367pensiate che sia colui che, eventualmente, accetterà la vostra patch e 368la integrerà. Nonostante sia possibile inviare patch direttamente a 369Linus Torvalds, e lasciare che sia lui ad integrarle,solitamente non è la 370strada migliore da seguire. Linus è occupato, e ci sono dei manutentori di 371sotto-sistema che controllano una parte specifica del kernel. Solitamente, 372vorreste che siano questi manutentori ad integrare le vostre patch. Se non 373c'è un chiaro manutentore, l'ultima spiaggia è spesso Andrew Morton. 374 375Le patch devono avere anche un buon oggetto. Il tipico formato per l'oggetto 376di una patch assomiglia a questo: 377 378:: 379 380 [PATCH nn/mm] subsys: one-line description of the patch 381 382dove "nn" è il numero ordinale della patch, "mm" è il numero totale delle patch 383nella serie, e "subsys" è il nome del sottosistema interessato. Chiaramente, 384nn/mm può essere omesso per una serie composta da una singola patch. 385 386Se avete una significative serie di patch, è prassi inviare una descrizione 387introduttiva come parte zero. Tuttavia questa convenzione non è universalmente 388seguita; se la usate, ricordate che le informazioni nell'introduzione non 389faranno parte del changelog del kernel. Quindi per favore, assicuratevi che 390ogni patch abbia un changelog completo. 391 392In generale, la seconda parte e quelle successive di una patch "composta" 393dovrebbero essere inviate come risposta alla prima, cosicché vengano viste 394come un unico *thread*. Strumenti come git e quilt hanno comandi per inviare 395gruppi di patch con la struttura appropriata. Se avete una serie lunga 396e state usando git, per favore state alla larga dall'opzione --chain-reply-to 397per evitare di creare un annidamento eccessivo. 398