18c2ecf20Sopenharmony_ci.. include:: ../disclaimer-ita.rst 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci:Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>` 48c2ecf20Sopenharmony_ci:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci.. _it_development_advancedtopics: 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ciArgomenti avanzati 98c2ecf20Sopenharmony_ci================== 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ciA questo punto, si spera, dovreste avere un'idea su come funziona il processo 128c2ecf20Sopenharmony_cidi sviluppo. Ma rimane comunque molto da imparare! Questo capitolo copre 138c2ecf20Sopenharmony_cialcuni argomenti che potrebbero essere utili per gli sviluppatori che stanno 148c2ecf20Sopenharmony_ciper diventare parte integrante del processo di sviluppo del kernel. 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciGestire le modifiche con git 178c2ecf20Sopenharmony_ci----------------------------- 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciL'uso di un sistema distribuito per il controllo delle versioni del kernel 208c2ecf20Sopenharmony_ciebbe iniziò nel 2002 quando Linux iniziò a provare il programma proprietario 218c2ecf20Sopenharmony_ciBitKeeper. Nonostante l'uso di BitKeeper fosse opinabile, di certo il suo 228c2ecf20Sopenharmony_ciapproccio alla gestione dei sorgenti non lo era. Un sistema distribuito per 238c2ecf20Sopenharmony_ciil controllo delle versioni accelerò immediatamente lo sviluppo del kernel. 248c2ecf20Sopenharmony_ciOggigiorno, ci sono diverse alternative libere a BitKeeper. Per il meglio o il 258c2ecf20Sopenharmony_cipeggio, il progetto del kernel ha deciso di usare git per gestire i sorgenti. 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ciGestire le modifiche con git può rendere la vita dello sviluppatore molto 288c2ecf20Sopenharmony_cipiù facile, specialmente quando il volume delle modifiche cresce. 298c2ecf20Sopenharmony_ciGit ha anche i suoi lati taglienti che possono essere pericolosi; è uno 308c2ecf20Sopenharmony_cistrumento giovane e potente che è ancora in fase di civilizzazione da parte 318c2ecf20Sopenharmony_cidei suoi sviluppatori. Questo documento non ha lo scopo di insegnare l'uso 328c2ecf20Sopenharmony_cidi git ai suoi lettori; ci sarebbe materiale a sufficienza per un lungo 338c2ecf20Sopenharmony_cidocumento al riguardo. Invece, qui ci concentriamo in particolare su come 348c2ecf20Sopenharmony_cigit è parte del processo di sviluppo del kernel. Gli sviluppatori che 358c2ecf20Sopenharmony_cidesiderassero diventare agili con git troveranno più informazioni ai 368c2ecf20Sopenharmony_ciseguenti indirizzi: 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci http://git-scm.com/ 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci http://www.kernel.org/pub/software/scm/git/docs/user-manual.html 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_cie su varie guide che potrete trovare su internet. 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ciLa prima cosa da fare prima di usarlo per produrre patch che saranno 458c2ecf20Sopenharmony_cidisponibili ad altri, è quella di leggere i siti qui sopra e di acquisire una 468c2ecf20Sopenharmony_cibase solida su come funziona git. Uno sviluppatore che sappia usare git 478c2ecf20Sopenharmony_cidovrebbe essere capace di ottenere una copia del repositorio principale, 488c2ecf20Sopenharmony_ciesplorare la storia della revisione, registrare le modifiche, usare i rami, 498c2ecf20Sopenharmony_cieccetera. Una certa comprensione degli strumenti git per riscrivere la storia 508c2ecf20Sopenharmony_ci(come ``rebase``) è altrettanto utile. Git ha i propri concetti e la propria 518c2ecf20Sopenharmony_citerminologia; un nuovo utente dovrebbe conoscere *refs*, *remote branch*, 528c2ecf20Sopenharmony_ci*index*, *fast-forward merge*, *push* e *pull*, *detached head*, eccetera. 538c2ecf20Sopenharmony_ciIl tutto potrebbe essere un po' intimidatorio visto da fuori, ma con un po' 548c2ecf20Sopenharmony_cidi studio i concetti non saranno così difficili da capire. 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ciUtilizzare git per produrre patch da sottomettere via email può essere 578c2ecf20Sopenharmony_ciun buon esercizio da fare mentre si sta prendendo confidenza con lo strumento. 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ciQuando sarete in grado di creare rami git che siano guardabili da altri, 608c2ecf20Sopenharmony_civi servirà, ovviamente, un server dal quale sia possibile attingere le vostre 618c2ecf20Sopenharmony_cimodifiche. Se avete un server accessibile da Internet, configurarlo per 628c2ecf20Sopenharmony_cieseguire git-daemon è relativamente semplice . Altrimenti, iniziano a 638c2ecf20Sopenharmony_cisvilupparsi piattaforme che offrono spazi pubblici, e gratuiti (Github, 648c2ecf20Sopenharmony_ciper esempio). Gli sviluppatori permanenti possono ottenere un account 658c2ecf20Sopenharmony_cisu kernel.org, ma non è proprio facile da ottenere; per maggiori informazioni 668c2ecf20Sopenharmony_ciconsultate la pagina web http://kernel.org/faq/. 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ciIn git è normale avere a che fare con tanti rami. Ogni linea di sviluppo 698c2ecf20Sopenharmony_cipuò essere separata in "rami per argomenti" e gestiti indipendentemente. 708c2ecf20Sopenharmony_ciIn git i rami sono facilissimi, per cui non c'è motivo per non usarli 718c2ecf20Sopenharmony_ciin libertà. In ogni caso, non dovreste sviluppare su alcun ramo dal 728c2ecf20Sopenharmony_ciquale altri potrebbero attingere. I rami disponibili pubblicamente dovrebbero 738c2ecf20Sopenharmony_ciessere creati con attenzione; integrate patch dai rami di sviluppo 748c2ecf20Sopenharmony_cisolo quando sono complete e pronte ad essere consegnate - non prima. 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ciGit offre alcuni strumenti che vi permettono di riscrivere la storia del 778c2ecf20Sopenharmony_civostro sviluppo. Una modifica errata (diciamo, una che rompe la bisezione, 788c2ecf20Sopenharmony_cioppure che ha un qualche tipo di baco evidente) può essere corretta sul posto 798c2ecf20Sopenharmony_cio fatta sparire completamente dalla storia. Una serie di patch può essere 808c2ecf20Sopenharmony_ciriscritta come se fosse stata scritta in cima al ramo principale di oggi, 818c2ecf20Sopenharmony_cianche se ci avete lavorato per mesi. Le modifiche possono essere spostate 828c2ecf20Sopenharmony_ciin modo trasparente da un ramo ad un altro. E così via. Un uso giudizioso 838c2ecf20Sopenharmony_cidi git per revisionare la storia può aiutare nella creazione di una serie 848c2ecf20Sopenharmony_cidi patch pulite e con meno problemi. 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ciUn uso eccessivo può portare ad altri tipi di problemi, tuttavia, oltre 878c2ecf20Sopenharmony_cialla semplice ossessione per la creazione di una storia del progetto che sia 888c2ecf20Sopenharmony_ciperfetta. Riscrivere la storia riscriverà le patch contenute in quella 898c2ecf20Sopenharmony_cistoria, trasformando un kernel verificato (si spera) in uno da verificare. 908c2ecf20Sopenharmony_ciMa, oltre a questo, gli sviluppatori non possono collaborare se non condividono 918c2ecf20Sopenharmony_cila stessa vista sulla storia del progetto; se riscrivete la storia dalla quale 928c2ecf20Sopenharmony_cialtri sviluppatori hanno attinto per i loro repositori, renderete la loro vita 938c2ecf20Sopenharmony_cimolto più difficile. Quindi tenete conto di questa semplice regola generale: 948c2ecf20Sopenharmony_cila storia che avete esposto ad altri, generalmente, dovrebbe essere vista come 958c2ecf20Sopenharmony_ciimmutabile. 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ciDunque, una volta che il vostro insieme di patch è stato reso disponibile 988c2ecf20Sopenharmony_cipubblicamente non dovrebbe essere più sovrascritto. Git tenterà di imporre 998c2ecf20Sopenharmony_ciquesta regola, e si rifiuterà di pubblicare nuove patch che non risultino 1008c2ecf20Sopenharmony_ciessere dirette discendenti di quelle pubblicate in precedenza (in altre parole, 1018c2ecf20Sopenharmony_cipatch che non condividono la stessa storia). È possibile ignorare questo 1028c2ecf20Sopenharmony_cicontrollo, e ci saranno momenti in cui sarà davvero necessario riscrivere 1038c2ecf20Sopenharmony_ciun ramo già pubblicato. Un esempio è linux-next dove le patch vengono 1048c2ecf20Sopenharmony_cispostate da un ramo all'altro al fine di evitare conflitti. Ma questo tipo 1058c2ecf20Sopenharmony_cid'azione dovrebbe essere un'eccezione. Questo è uno dei motivi per cui lo 1068c2ecf20Sopenharmony_cisviluppo dovrebbe avvenire in rami privati (che possono essere sovrascritti 1078c2ecf20Sopenharmony_ciquando lo si ritiene necessario) e reso pubblico solo quando è in uno stato 1088c2ecf20Sopenharmony_ciavanzato. 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ciMan mano che il ramo principale (o altri rami su cui avete basato le 1118c2ecf20Sopenharmony_cimodifiche) avanza, diventa allettante l'idea di integrare tutte le patch 1128c2ecf20Sopenharmony_ciper rimanere sempre aggiornati. Per un ramo privato, il *rebase* può essere 1138c2ecf20Sopenharmony_ciun modo semplice per rimanere aggiornati, ma questa non è un'opzione nel 1148c2ecf20Sopenharmony_cimomento in cui il vostro ramo è stato esposto al mondo intero. 1158c2ecf20Sopenharmony_ci*Merge* occasionali possono essere considerati di buon senso, ma quando 1168c2ecf20Sopenharmony_cidiventano troppo frequenti confondono inutilmente la storia. La tecnica 1178c2ecf20Sopenharmony_cisuggerita in questi casi è quella di fare *merge* raramente, e più in generale 1188c2ecf20Sopenharmony_cisolo nei momenti di rilascio (per esempio gli -rc del ramo principale). 1198c2ecf20Sopenharmony_ciSe siete nervosi circa alcune patch in particolare, potete sempre fare 1208c2ecf20Sopenharmony_cidei *merge* di test in un ramo privato. In queste situazioni git "rerere" 1218c2ecf20Sopenharmony_cipuò essere utile; questo strumento si ricorda come i conflitti di *merge* 1228c2ecf20Sopenharmony_cifurono risolti in passato cosicché non dovrete fare lo stesso lavoro due volte. 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ciUna delle lamentele più grosse e ricorrenti sull'uso di strumenti come git 1258c2ecf20Sopenharmony_ciè il grande movimento di patch da un repositorio all'altro che rende 1268c2ecf20Sopenharmony_cifacile l'integrazione nel ramo principale di modifiche mediocri, il tutto 1278c2ecf20Sopenharmony_cisotto il naso dei revisori. Gli sviluppatori del kernel tendono ad essere 1288c2ecf20Sopenharmony_ciscontenti quando vedono succedere queste cose; preparare un ramo git con 1298c2ecf20Sopenharmony_cipatch che non hanno ricevuto alcuna revisione o completamente avulse, potrebbe 1308c2ecf20Sopenharmony_ciinfluire sulla vostra capacita di proporre, in futuro, l'integrazione dei 1318c2ecf20Sopenharmony_civostri rami. Citando Linus 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci:: 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci Potete inviarmi le vostre patch, ma per far si che io integri una 1368c2ecf20Sopenharmony_ci vostra modifica da git, devo sapere che voi sappiate cosa state 1378c2ecf20Sopenharmony_ci facendo, e ho bisogno di fidarmi *senza* dover passare tutte 1388c2ecf20Sopenharmony_ci le modifiche manualmente una per una. 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci(http://lwn.net/Articles/224135/). 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ciPer evitare queste situazioni, assicuratevi che tutte le patch in un ramo 1438c2ecf20Sopenharmony_cisiano strettamente correlate al tema delle modifiche; un ramo "driver fixes" 1448c2ecf20Sopenharmony_cinon dovrebbe fare modifiche al codice principale per la gestione della memoria. 1458c2ecf20Sopenharmony_ciE, più importante ancora, non usate un repositorio git per tentare di 1468c2ecf20Sopenharmony_cievitare il processo di revisione. Pubblicate un sommario di quello che il 1478c2ecf20Sopenharmony_civostro ramo contiene sulle liste di discussione più opportune, e , quando 1488c2ecf20Sopenharmony_cisarà il momento, richiedete che il vostro ramo venga integrato in linux-next. 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ciSe e quando altri inizieranno ad inviarvi patch per essere incluse nel 1518c2ecf20Sopenharmony_civostro repositorio, non dovete dimenticare di revisionarle. Inoltre 1528c2ecf20Sopenharmony_ciassicuratevi di mantenerne le informazioni di paternità; al riguardo git "am" 1538c2ecf20Sopenharmony_cifa del suo meglio, ma potreste dover aggiungere una riga "From:" alla patch 1548c2ecf20Sopenharmony_cinel caso in cui sia arrivata per vie traverse. 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ciQuando richiedete l'integrazione, siate certi di fornire tutte le informazioni: 1578c2ecf20Sopenharmony_cidov'è il vostro repositorio, quale ramo integrare, e quali cambiamenti si 1588c2ecf20Sopenharmony_ciotterranno dall'integrazione. Il comando git request-pull può essere d'aiuto; 1598c2ecf20Sopenharmony_cipreparerà una richiesta nel modo in cui gli altri sviluppatori se l'aspettano, 1608c2ecf20Sopenharmony_cie verificherà che vi siate ricordati di pubblicare quelle patch su un 1618c2ecf20Sopenharmony_ciserver pubblico. 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ciRevisionare le patch 1648c2ecf20Sopenharmony_ci-------------------- 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ciAlcuni lettori potrebbero avere obiezioni sulla presenza di questa sezione 1678c2ecf20Sopenharmony_cinegli "argomenti avanzati" sulla base che anche gli sviluppatori principianti 1688c2ecf20Sopenharmony_cidovrebbero revisionare le patch. É certamente vero che non c'è modo 1698c2ecf20Sopenharmony_cimigliore di imparare come programmare per il kernel che guardare il codice 1708c2ecf20Sopenharmony_cipubblicato dagli altri. In aggiunta, i revisori sono sempre troppo pochi; 1718c2ecf20Sopenharmony_ciguardando il codice potete apportare un significativo contributo all'intero 1728c2ecf20Sopenharmony_ciprocesso. 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ciRevisionare il codice potrebbe risultare intimidatorio, specialmente per i 1758c2ecf20Sopenharmony_cinuovi arrivati che potrebbero sentirsi un po' nervosi nel questionare 1768c2ecf20Sopenharmony_ciil codice - in pubblico - pubblicato da sviluppatori più esperti. Perfino 1778c2ecf20Sopenharmony_ciil codice scritto dagli sviluppatori più esperti può essere migliorato. 1788c2ecf20Sopenharmony_ciForse il suggerimento migliore per i revisori (tutti) è questo: formulate 1798c2ecf20Sopenharmony_cii commenti come domande e non come critiche. Chiedere "Come viene rilasciato 1808c2ecf20Sopenharmony_ciil *lock* in questo percorso?" funziona sempre molto meglio che 1818c2ecf20Sopenharmony_ci"qui la sincronizzazione è sbagliata". 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ciDiversi sviluppatori revisioneranno il codice con diversi punti di vista. 1848c2ecf20Sopenharmony_ciAlcuni potrebbero concentrarsi principalmente sullo stile del codice e se 1858c2ecf20Sopenharmony_cialcune linee hanno degli spazio bianchi di troppo. Altri si chiederanno 1868c2ecf20Sopenharmony_cise accettare una modifica interamente è una cosa positiva per il kernel 1878c2ecf20Sopenharmony_cio no. E altri ancora si focalizzeranno sui problemi di sincronizzazione, 1888c2ecf20Sopenharmony_cil'uso eccessivo di *stack*, problemi di sicurezza, duplicazione del codice 1898c2ecf20Sopenharmony_ciin altri contesti, documentazione, effetti negativi sulle prestazioni, cambi 1908c2ecf20Sopenharmony_ciall'ABI dello spazio utente, eccetera. Qualunque tipo di revisione è ben 1918c2ecf20Sopenharmony_ciaccetta e di valore, se porta ad avere un codice migliore nel kernel. 192