1*4882a593Smuzhiyun.. include:: ../disclaimer-ita.rst 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun:Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>` 4*4882a593Smuzhiyun:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun.. _it_development_advancedtopics: 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunArgomenti avanzati 9*4882a593Smuzhiyun================== 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunA questo punto, si spera, dovreste avere un'idea su come funziona il processo 12*4882a593Smuzhiyundi sviluppo. Ma rimane comunque molto da imparare! Questo capitolo copre 13*4882a593Smuzhiyunalcuni argomenti che potrebbero essere utili per gli sviluppatori che stanno 14*4882a593Smuzhiyunper diventare parte integrante del processo di sviluppo del kernel. 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunGestire le modifiche con git 17*4882a593Smuzhiyun----------------------------- 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunL'uso di un sistema distribuito per il controllo delle versioni del kernel 20*4882a593Smuzhiyunebbe iniziò nel 2002 quando Linux iniziò a provare il programma proprietario 21*4882a593SmuzhiyunBitKeeper. Nonostante l'uso di BitKeeper fosse opinabile, di certo il suo 22*4882a593Smuzhiyunapproccio alla gestione dei sorgenti non lo era. Un sistema distribuito per 23*4882a593Smuzhiyunil controllo delle versioni accelerò immediatamente lo sviluppo del kernel. 24*4882a593SmuzhiyunOggigiorno, ci sono diverse alternative libere a BitKeeper. Per il meglio o il 25*4882a593Smuzhiyunpeggio, il progetto del kernel ha deciso di usare git per gestire i sorgenti. 26*4882a593Smuzhiyun 27*4882a593SmuzhiyunGestire le modifiche con git può rendere la vita dello sviluppatore molto 28*4882a593Smuzhiyunpiù facile, specialmente quando il volume delle modifiche cresce. 29*4882a593SmuzhiyunGit ha anche i suoi lati taglienti che possono essere pericolosi; è uno 30*4882a593Smuzhiyunstrumento giovane e potente che è ancora in fase di civilizzazione da parte 31*4882a593Smuzhiyundei suoi sviluppatori. Questo documento non ha lo scopo di insegnare l'uso 32*4882a593Smuzhiyundi git ai suoi lettori; ci sarebbe materiale a sufficienza per un lungo 33*4882a593Smuzhiyundocumento al riguardo. Invece, qui ci concentriamo in particolare su come 34*4882a593Smuzhiyungit è parte del processo di sviluppo del kernel. Gli sviluppatori che 35*4882a593Smuzhiyundesiderassero diventare agili con git troveranno più informazioni ai 36*4882a593Smuzhiyunseguenti indirizzi: 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun http://git-scm.com/ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun http://www.kernel.org/pub/software/scm/git/docs/user-manual.html 41*4882a593Smuzhiyun 42*4882a593Smuzhiyune su varie guide che potrete trovare su internet. 43*4882a593Smuzhiyun 44*4882a593SmuzhiyunLa prima cosa da fare prima di usarlo per produrre patch che saranno 45*4882a593Smuzhiyundisponibili ad altri, è quella di leggere i siti qui sopra e di acquisire una 46*4882a593Smuzhiyunbase solida su come funziona git. Uno sviluppatore che sappia usare git 47*4882a593Smuzhiyundovrebbe essere capace di ottenere una copia del repositorio principale, 48*4882a593Smuzhiyunesplorare la storia della revisione, registrare le modifiche, usare i rami, 49*4882a593Smuzhiyuneccetera. Una certa comprensione degli strumenti git per riscrivere la storia 50*4882a593Smuzhiyun(come ``rebase``) è altrettanto utile. Git ha i propri concetti e la propria 51*4882a593Smuzhiyunterminologia; un nuovo utente dovrebbe conoscere *refs*, *remote branch*, 52*4882a593Smuzhiyun*index*, *fast-forward merge*, *push* e *pull*, *detached head*, eccetera. 53*4882a593SmuzhiyunIl tutto potrebbe essere un po' intimidatorio visto da fuori, ma con un po' 54*4882a593Smuzhiyundi studio i concetti non saranno così difficili da capire. 55*4882a593Smuzhiyun 56*4882a593SmuzhiyunUtilizzare git per produrre patch da sottomettere via email può essere 57*4882a593Smuzhiyunun buon esercizio da fare mentre si sta prendendo confidenza con lo strumento. 58*4882a593Smuzhiyun 59*4882a593SmuzhiyunQuando sarete in grado di creare rami git che siano guardabili da altri, 60*4882a593Smuzhiyunvi servirà, ovviamente, un server dal quale sia possibile attingere le vostre 61*4882a593Smuzhiyunmodifiche. Se avete un server accessibile da Internet, configurarlo per 62*4882a593Smuzhiyuneseguire git-daemon è relativamente semplice . Altrimenti, iniziano a 63*4882a593Smuzhiyunsvilupparsi piattaforme che offrono spazi pubblici, e gratuiti (Github, 64*4882a593Smuzhiyunper esempio). Gli sviluppatori permanenti possono ottenere un account 65*4882a593Smuzhiyunsu kernel.org, ma non è proprio facile da ottenere; per maggiori informazioni 66*4882a593Smuzhiyunconsultate la pagina web http://kernel.org/faq/. 67*4882a593Smuzhiyun 68*4882a593SmuzhiyunIn git è normale avere a che fare con tanti rami. Ogni linea di sviluppo 69*4882a593Smuzhiyunpuò essere separata in "rami per argomenti" e gestiti indipendentemente. 70*4882a593SmuzhiyunIn git i rami sono facilissimi, per cui non c'è motivo per non usarli 71*4882a593Smuzhiyunin libertà. In ogni caso, non dovreste sviluppare su alcun ramo dal 72*4882a593Smuzhiyunquale altri potrebbero attingere. I rami disponibili pubblicamente dovrebbero 73*4882a593Smuzhiyunessere creati con attenzione; integrate patch dai rami di sviluppo 74*4882a593Smuzhiyunsolo quando sono complete e pronte ad essere consegnate - non prima. 75*4882a593Smuzhiyun 76*4882a593SmuzhiyunGit offre alcuni strumenti che vi permettono di riscrivere la storia del 77*4882a593Smuzhiyunvostro sviluppo. Una modifica errata (diciamo, una che rompe la bisezione, 78*4882a593Smuzhiyunoppure che ha un qualche tipo di baco evidente) può essere corretta sul posto 79*4882a593Smuzhiyuno fatta sparire completamente dalla storia. Una serie di patch può essere 80*4882a593Smuzhiyunriscritta come se fosse stata scritta in cima al ramo principale di oggi, 81*4882a593Smuzhiyunanche se ci avete lavorato per mesi. Le modifiche possono essere spostate 82*4882a593Smuzhiyunin modo trasparente da un ramo ad un altro. E così via. Un uso giudizioso 83*4882a593Smuzhiyundi git per revisionare la storia può aiutare nella creazione di una serie 84*4882a593Smuzhiyundi patch pulite e con meno problemi. 85*4882a593Smuzhiyun 86*4882a593SmuzhiyunUn uso eccessivo può portare ad altri tipi di problemi, tuttavia, oltre 87*4882a593Smuzhiyunalla semplice ossessione per la creazione di una storia del progetto che sia 88*4882a593Smuzhiyunperfetta. Riscrivere la storia riscriverà le patch contenute in quella 89*4882a593Smuzhiyunstoria, trasformando un kernel verificato (si spera) in uno da verificare. 90*4882a593SmuzhiyunMa, oltre a questo, gli sviluppatori non possono collaborare se non condividono 91*4882a593Smuzhiyunla stessa vista sulla storia del progetto; se riscrivete la storia dalla quale 92*4882a593Smuzhiyunaltri sviluppatori hanno attinto per i loro repositori, renderete la loro vita 93*4882a593Smuzhiyunmolto più difficile. Quindi tenete conto di questa semplice regola generale: 94*4882a593Smuzhiyunla storia che avete esposto ad altri, generalmente, dovrebbe essere vista come 95*4882a593Smuzhiyunimmutabile. 96*4882a593Smuzhiyun 97*4882a593SmuzhiyunDunque, una volta che il vostro insieme di patch è stato reso disponibile 98*4882a593Smuzhiyunpubblicamente non dovrebbe essere più sovrascritto. Git tenterà di imporre 99*4882a593Smuzhiyunquesta regola, e si rifiuterà di pubblicare nuove patch che non risultino 100*4882a593Smuzhiyunessere dirette discendenti di quelle pubblicate in precedenza (in altre parole, 101*4882a593Smuzhiyunpatch che non condividono la stessa storia). È possibile ignorare questo 102*4882a593Smuzhiyuncontrollo, e ci saranno momenti in cui sarà davvero necessario riscrivere 103*4882a593Smuzhiyunun ramo già pubblicato. Un esempio è linux-next dove le patch vengono 104*4882a593Smuzhiyunspostate da un ramo all'altro al fine di evitare conflitti. Ma questo tipo 105*4882a593Smuzhiyund'azione dovrebbe essere un'eccezione. Questo è uno dei motivi per cui lo 106*4882a593Smuzhiyunsviluppo dovrebbe avvenire in rami privati (che possono essere sovrascritti 107*4882a593Smuzhiyunquando lo si ritiene necessario) e reso pubblico solo quando è in uno stato 108*4882a593Smuzhiyunavanzato. 109*4882a593Smuzhiyun 110*4882a593SmuzhiyunMan mano che il ramo principale (o altri rami su cui avete basato le 111*4882a593Smuzhiyunmodifiche) avanza, diventa allettante l'idea di integrare tutte le patch 112*4882a593Smuzhiyunper rimanere sempre aggiornati. Per un ramo privato, il *rebase* può essere 113*4882a593Smuzhiyunun modo semplice per rimanere aggiornati, ma questa non è un'opzione nel 114*4882a593Smuzhiyunmomento in cui il vostro ramo è stato esposto al mondo intero. 115*4882a593Smuzhiyun*Merge* occasionali possono essere considerati di buon senso, ma quando 116*4882a593Smuzhiyundiventano troppo frequenti confondono inutilmente la storia. La tecnica 117*4882a593Smuzhiyunsuggerita in questi casi è quella di fare *merge* raramente, e più in generale 118*4882a593Smuzhiyunsolo nei momenti di rilascio (per esempio gli -rc del ramo principale). 119*4882a593SmuzhiyunSe siete nervosi circa alcune patch in particolare, potete sempre fare 120*4882a593Smuzhiyundei *merge* di test in un ramo privato. In queste situazioni git "rerere" 121*4882a593Smuzhiyunpuò essere utile; questo strumento si ricorda come i conflitti di *merge* 122*4882a593Smuzhiyunfurono risolti in passato cosicché non dovrete fare lo stesso lavoro due volte. 123*4882a593Smuzhiyun 124*4882a593SmuzhiyunUna delle lamentele più grosse e ricorrenti sull'uso di strumenti come git 125*4882a593Smuzhiyunè il grande movimento di patch da un repositorio all'altro che rende 126*4882a593Smuzhiyunfacile l'integrazione nel ramo principale di modifiche mediocri, il tutto 127*4882a593Smuzhiyunsotto il naso dei revisori. Gli sviluppatori del kernel tendono ad essere 128*4882a593Smuzhiyunscontenti quando vedono succedere queste cose; preparare un ramo git con 129*4882a593Smuzhiyunpatch che non hanno ricevuto alcuna revisione o completamente avulse, potrebbe 130*4882a593Smuzhiyuninfluire sulla vostra capacita di proporre, in futuro, l'integrazione dei 131*4882a593Smuzhiyunvostri rami. Citando Linus 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun:: 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun Potete inviarmi le vostre patch, ma per far si che io integri una 136*4882a593Smuzhiyun vostra modifica da git, devo sapere che voi sappiate cosa state 137*4882a593Smuzhiyun facendo, e ho bisogno di fidarmi *senza* dover passare tutte 138*4882a593Smuzhiyun le modifiche manualmente una per una. 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun(http://lwn.net/Articles/224135/). 141*4882a593Smuzhiyun 142*4882a593SmuzhiyunPer evitare queste situazioni, assicuratevi che tutte le patch in un ramo 143*4882a593Smuzhiyunsiano strettamente correlate al tema delle modifiche; un ramo "driver fixes" 144*4882a593Smuzhiyunnon dovrebbe fare modifiche al codice principale per la gestione della memoria. 145*4882a593SmuzhiyunE, più importante ancora, non usate un repositorio git per tentare di 146*4882a593Smuzhiyunevitare il processo di revisione. Pubblicate un sommario di quello che il 147*4882a593Smuzhiyunvostro ramo contiene sulle liste di discussione più opportune, e , quando 148*4882a593Smuzhiyunsarà il momento, richiedete che il vostro ramo venga integrato in linux-next. 149*4882a593Smuzhiyun 150*4882a593SmuzhiyunSe e quando altri inizieranno ad inviarvi patch per essere incluse nel 151*4882a593Smuzhiyunvostro repositorio, non dovete dimenticare di revisionarle. Inoltre 152*4882a593Smuzhiyunassicuratevi di mantenerne le informazioni di paternità; al riguardo git "am" 153*4882a593Smuzhiyunfa del suo meglio, ma potreste dover aggiungere una riga "From:" alla patch 154*4882a593Smuzhiyunnel caso in cui sia arrivata per vie traverse. 155*4882a593Smuzhiyun 156*4882a593SmuzhiyunQuando richiedete l'integrazione, siate certi di fornire tutte le informazioni: 157*4882a593Smuzhiyundov'è il vostro repositorio, quale ramo integrare, e quali cambiamenti si 158*4882a593Smuzhiyunotterranno dall'integrazione. Il comando git request-pull può essere d'aiuto; 159*4882a593Smuzhiyunpreparerà una richiesta nel modo in cui gli altri sviluppatori se l'aspettano, 160*4882a593Smuzhiyune verificherà che vi siate ricordati di pubblicare quelle patch su un 161*4882a593Smuzhiyunserver pubblico. 162*4882a593Smuzhiyun 163*4882a593SmuzhiyunRevisionare le patch 164*4882a593Smuzhiyun-------------------- 165*4882a593Smuzhiyun 166*4882a593SmuzhiyunAlcuni lettori potrebbero avere obiezioni sulla presenza di questa sezione 167*4882a593Smuzhiyunnegli "argomenti avanzati" sulla base che anche gli sviluppatori principianti 168*4882a593Smuzhiyundovrebbero revisionare le patch. É certamente vero che non c'è modo 169*4882a593Smuzhiyunmigliore di imparare come programmare per il kernel che guardare il codice 170*4882a593Smuzhiyunpubblicato dagli altri. In aggiunta, i revisori sono sempre troppo pochi; 171*4882a593Smuzhiyunguardando il codice potete apportare un significativo contributo all'intero 172*4882a593Smuzhiyunprocesso. 173*4882a593Smuzhiyun 174*4882a593SmuzhiyunRevisionare il codice potrebbe risultare intimidatorio, specialmente per i 175*4882a593Smuzhiyunnuovi arrivati che potrebbero sentirsi un po' nervosi nel questionare 176*4882a593Smuzhiyunil codice - in pubblico - pubblicato da sviluppatori più esperti. Perfino 177*4882a593Smuzhiyunil codice scritto dagli sviluppatori più esperti può essere migliorato. 178*4882a593SmuzhiyunForse il suggerimento migliore per i revisori (tutti) è questo: formulate 179*4882a593Smuzhiyuni commenti come domande e non come critiche. Chiedere "Come viene rilasciato 180*4882a593Smuzhiyunil *lock* in questo percorso?" funziona sempre molto meglio che 181*4882a593Smuzhiyun"qui la sincronizzazione è sbagliata". 182*4882a593Smuzhiyun 183*4882a593SmuzhiyunDiversi sviluppatori revisioneranno il codice con diversi punti di vista. 184*4882a593SmuzhiyunAlcuni potrebbero concentrarsi principalmente sullo stile del codice e se 185*4882a593Smuzhiyunalcune linee hanno degli spazio bianchi di troppo. Altri si chiederanno 186*4882a593Smuzhiyunse accettare una modifica interamente è una cosa positiva per il kernel 187*4882a593Smuzhiyuno no. E altri ancora si focalizzeranno sui problemi di sincronizzazione, 188*4882a593Smuzhiyunl'uso eccessivo di *stack*, problemi di sicurezza, duplicazione del codice 189*4882a593Smuzhiyunin altri contesti, documentazione, effetti negativi sulle prestazioni, cambi 190*4882a593Smuzhiyunall'ABI dello spazio utente, eccetera. Qualunque tipo di revisione è ben 191*4882a593Smuzhiyunaccetta e di valore, se porta ad avere un codice migliore nel kernel. 192