162306a36Sopenharmony_ci.. include:: ../disclaimer-ita.rst 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci:Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>` 462306a36Sopenharmony_ci:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci.. _it_development_advancedtopics: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciArgomenti avanzati 962306a36Sopenharmony_ci================== 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciA questo punto, si spera, dovreste avere un'idea su come funziona il processo 1262306a36Sopenharmony_cidi sviluppo. Ma rimane comunque molto da imparare! Questo capitolo copre 1362306a36Sopenharmony_cialcuni argomenti che potrebbero essere utili per gli sviluppatori che stanno 1462306a36Sopenharmony_ciper diventare parte integrante del processo di sviluppo del kernel. 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciGestire le modifiche con git 1762306a36Sopenharmony_ci----------------------------- 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciL'uso di un sistema distribuito per il controllo delle versioni del kernel 2062306a36Sopenharmony_ciebbe iniziò nel 2002 quando Linux iniziò a provare il programma proprietario 2162306a36Sopenharmony_ciBitKeeper. Nonostante l'uso di BitKeeper fosse opinabile, di certo il suo 2262306a36Sopenharmony_ciapproccio alla gestione dei sorgenti non lo era. Un sistema distribuito per 2362306a36Sopenharmony_ciil controllo delle versioni accelerò immediatamente lo sviluppo del kernel. 2462306a36Sopenharmony_ciOggigiorno, ci sono diverse alternative libere a BitKeeper. Per il meglio o il 2562306a36Sopenharmony_cipeggio, il progetto del kernel ha deciso di usare git per gestire i sorgenti. 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciGestire le modifiche con git può rendere la vita dello sviluppatore molto 2862306a36Sopenharmony_cipiù facile, specialmente quando il volume delle modifiche cresce. 2962306a36Sopenharmony_ciGit ha anche i suoi lati taglienti che possono essere pericolosi; è uno 3062306a36Sopenharmony_cistrumento giovane e potente che è ancora in fase di civilizzazione da parte 3162306a36Sopenharmony_cidei suoi sviluppatori. Questo documento non ha lo scopo di insegnare l'uso 3262306a36Sopenharmony_cidi git ai suoi lettori; ci sarebbe materiale a sufficienza per un lungo 3362306a36Sopenharmony_cidocumento al riguardo. Invece, qui ci concentriamo in particolare su come 3462306a36Sopenharmony_cigit è parte del processo di sviluppo del kernel. Gli sviluppatori che 3562306a36Sopenharmony_cidesiderassero diventare agili con git troveranno più informazioni ai 3662306a36Sopenharmony_ciseguenti indirizzi: 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci https://git-scm.com/ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci https://www.kernel.org/pub/software/scm/git/docs/user-manual.html 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cie su varie guide che potrete trovare su internet. 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciLa prima cosa da fare prima di usarlo per produrre patch che saranno 4562306a36Sopenharmony_cidisponibili ad altri, è quella di leggere i siti qui sopra e di acquisire una 4662306a36Sopenharmony_cibase solida su come funziona git. Uno sviluppatore che sappia usare git 4762306a36Sopenharmony_cidovrebbe essere capace di ottenere una copia del repositorio principale, 4862306a36Sopenharmony_ciesplorare la storia della revisione, registrare le modifiche, usare i rami, 4962306a36Sopenharmony_cieccetera. Una certa comprensione degli strumenti git per riscrivere la storia 5062306a36Sopenharmony_ci(come ``rebase``) è altrettanto utile. Git ha i propri concetti e la propria 5162306a36Sopenharmony_citerminologia; un nuovo utente dovrebbe conoscere *refs*, *remote branch*, 5262306a36Sopenharmony_ci*index*, *fast-forward merge*, *push* e *pull*, *detached head*, eccetera. 5362306a36Sopenharmony_ciIl tutto potrebbe essere un po' intimidatorio visto da fuori, ma con un po' 5462306a36Sopenharmony_cidi studio i concetti non saranno così difficili da capire. 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciUtilizzare git per produrre patch da sottomettere via email può essere 5762306a36Sopenharmony_ciun buon esercizio da fare mentre si sta prendendo confidenza con lo strumento. 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciQuando sarete in grado di creare rami git che siano guardabili da altri, 6062306a36Sopenharmony_civi servirà, ovviamente, un server dal quale sia possibile attingere le vostre 6162306a36Sopenharmony_cimodifiche. Se avete un server accessibile da Internet, configurarlo per 6262306a36Sopenharmony_cieseguire git-daemon è relativamente semplice . Altrimenti, iniziano a 6362306a36Sopenharmony_cisvilupparsi piattaforme che offrono spazi pubblici, e gratuiti (Github, 6462306a36Sopenharmony_ciper esempio). Gli sviluppatori permanenti possono ottenere un account 6562306a36Sopenharmony_cisu kernel.org, ma non è proprio facile da ottenere; per maggiori informazioni 6662306a36Sopenharmony_ciconsultate la pagina web https://kernel.org/faq/. 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciIn git è normale avere a che fare con tanti rami. Ogni linea di sviluppo 6962306a36Sopenharmony_cipuò essere separata in "rami per argomenti" e gestiti indipendentemente. 7062306a36Sopenharmony_ciIn git i rami sono facilissimi, per cui non c'è motivo per non usarli 7162306a36Sopenharmony_ciin libertà. In ogni caso, non dovreste sviluppare su alcun ramo dal 7262306a36Sopenharmony_ciquale altri potrebbero attingere. I rami disponibili pubblicamente dovrebbero 7362306a36Sopenharmony_ciessere creati con attenzione; integrate patch dai rami di sviluppo 7462306a36Sopenharmony_cisolo quando sono complete e pronte ad essere consegnate - non prima. 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciGit offre alcuni strumenti che vi permettono di riscrivere la storia del 7762306a36Sopenharmony_civostro sviluppo. Una modifica errata (diciamo, una che rompe la bisezione, 7862306a36Sopenharmony_cioppure che ha un qualche tipo di baco evidente) può essere corretta sul posto 7962306a36Sopenharmony_cio fatta sparire completamente dalla storia. Una serie di patch può essere 8062306a36Sopenharmony_ciriscritta come se fosse stata scritta in cima al ramo principale di oggi, 8162306a36Sopenharmony_cianche se ci avete lavorato per mesi. Le modifiche possono essere spostate 8262306a36Sopenharmony_ciin modo trasparente da un ramo ad un altro. E così via. Un uso giudizioso 8362306a36Sopenharmony_cidi git per revisionare la storia può aiutare nella creazione di una serie 8462306a36Sopenharmony_cidi patch pulite e con meno problemi. 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ciUn uso eccessivo può portare ad altri tipi di problemi, tuttavia, oltre 8762306a36Sopenharmony_cialla semplice ossessione per la creazione di una storia del progetto che sia 8862306a36Sopenharmony_ciperfetta. Riscrivere la storia riscriverà le patch contenute in quella 8962306a36Sopenharmony_cistoria, trasformando un kernel verificato (si spera) in uno da verificare. 9062306a36Sopenharmony_ciMa, oltre a questo, gli sviluppatori non possono collaborare se non condividono 9162306a36Sopenharmony_cila stessa vista sulla storia del progetto; se riscrivete la storia dalla quale 9262306a36Sopenharmony_cialtri sviluppatori hanno attinto per i loro repositori, renderete la loro vita 9362306a36Sopenharmony_cimolto più difficile. Quindi tenete conto di questa semplice regola generale: 9462306a36Sopenharmony_cila storia che avete esposto ad altri, generalmente, dovrebbe essere vista come 9562306a36Sopenharmony_ciimmutabile. 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ciDunque, una volta che il vostro insieme di patch è stato reso disponibile 9862306a36Sopenharmony_cipubblicamente non dovrebbe essere più sovrascritto. Git tenterà di imporre 9962306a36Sopenharmony_ciquesta regola, e si rifiuterà di pubblicare nuove patch che non risultino 10062306a36Sopenharmony_ciessere dirette discendenti di quelle pubblicate in precedenza (in altre parole, 10162306a36Sopenharmony_cipatch che non condividono la stessa storia). È possibile ignorare questo 10262306a36Sopenharmony_cicontrollo, e ci saranno momenti in cui sarà davvero necessario riscrivere 10362306a36Sopenharmony_ciun ramo già pubblicato. Un esempio è linux-next dove le patch vengono 10462306a36Sopenharmony_cispostate da un ramo all'altro al fine di evitare conflitti. Ma questo tipo 10562306a36Sopenharmony_cid'azione dovrebbe essere un'eccezione. Questo è uno dei motivi per cui lo 10662306a36Sopenharmony_cisviluppo dovrebbe avvenire in rami privati (che possono essere sovrascritti 10762306a36Sopenharmony_ciquando lo si ritiene necessario) e reso pubblico solo quando è in uno stato 10862306a36Sopenharmony_ciavanzato. 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ciMan mano che il ramo principale (o altri rami su cui avete basato le 11162306a36Sopenharmony_cimodifiche) avanza, diventa allettante l'idea di integrare tutte le patch 11262306a36Sopenharmony_ciper rimanere sempre aggiornati. Per un ramo privato, il *rebase* può essere 11362306a36Sopenharmony_ciun modo semplice per rimanere aggiornati, ma questa non è un'opzione nel 11462306a36Sopenharmony_cimomento in cui il vostro ramo è stato esposto al mondo intero. 11562306a36Sopenharmony_ci*Merge* occasionali possono essere considerati di buon senso, ma quando 11662306a36Sopenharmony_cidiventano troppo frequenti confondono inutilmente la storia. La tecnica 11762306a36Sopenharmony_cisuggerita in questi casi è quella di fare *merge* raramente, e più in generale 11862306a36Sopenharmony_cisolo nei momenti di rilascio (per esempio gli -rc del ramo principale). 11962306a36Sopenharmony_ciSe siete nervosi circa alcune patch in particolare, potete sempre fare 12062306a36Sopenharmony_cidei *merge* di test in un ramo privato. In queste situazioni git "rerere" 12162306a36Sopenharmony_cipuò essere utile; questo strumento si ricorda come i conflitti di *merge* 12262306a36Sopenharmony_cifurono risolti in passato cosicché non dovrete fare lo stesso lavoro due volte. 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciUna delle lamentele più grosse e ricorrenti sull'uso di strumenti come git 12562306a36Sopenharmony_ciè il grande movimento di patch da un repositorio all'altro che rende 12662306a36Sopenharmony_cifacile l'integrazione nel ramo principale di modifiche mediocri, il tutto 12762306a36Sopenharmony_cisotto il naso dei revisori. Gli sviluppatori del kernel tendono ad essere 12862306a36Sopenharmony_ciscontenti quando vedono succedere queste cose; preparare un ramo git con 12962306a36Sopenharmony_cipatch che non hanno ricevuto alcuna revisione o completamente avulse, potrebbe 13062306a36Sopenharmony_ciinfluire sulla vostra capacita di proporre, in futuro, l'integrazione dei 13162306a36Sopenharmony_civostri rami. Citando Linus 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci:: 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci Potete inviarmi le vostre patch, ma per far si che io integri una 13662306a36Sopenharmony_ci vostra modifica da git, devo sapere che voi sappiate cosa state 13762306a36Sopenharmony_ci facendo, e ho bisogno di fidarmi *senza* dover passare tutte 13862306a36Sopenharmony_ci le modifiche manualmente una per una. 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci(https://lwn.net/Articles/224135/). 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ciPer evitare queste situazioni, assicuratevi che tutte le patch in un ramo 14362306a36Sopenharmony_cisiano strettamente correlate al tema delle modifiche; un ramo "driver fixes" 14462306a36Sopenharmony_cinon dovrebbe fare modifiche al codice principale per la gestione della memoria. 14562306a36Sopenharmony_ciE, più importante ancora, non usate un repositorio git per tentare di 14662306a36Sopenharmony_cievitare il processo di revisione. Pubblicate un sommario di quello che il 14762306a36Sopenharmony_civostro ramo contiene sulle liste di discussione più opportune, e , quando 14862306a36Sopenharmony_cisarà il momento, richiedete che il vostro ramo venga integrato in linux-next. 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ciSe e quando altri inizieranno ad inviarvi patch per essere incluse nel 15162306a36Sopenharmony_civostro repositorio, non dovete dimenticare di revisionarle. Inoltre 15262306a36Sopenharmony_ciassicuratevi di mantenerne le informazioni di paternità; al riguardo git "am" 15362306a36Sopenharmony_cifa del suo meglio, ma potreste dover aggiungere una riga "From:" alla patch 15462306a36Sopenharmony_cinel caso in cui sia arrivata per vie traverse. 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ciQuando richiedete l'integrazione, siate certi di fornire tutte le informazioni: 15762306a36Sopenharmony_cidov'è il vostro repositorio, quale ramo integrare, e quali cambiamenti si 15862306a36Sopenharmony_ciotterranno dall'integrazione. Il comando git request-pull può essere d'aiuto; 15962306a36Sopenharmony_cipreparerà una richiesta nel modo in cui gli altri sviluppatori se l'aspettano, 16062306a36Sopenharmony_cie verificherà che vi siate ricordati di pubblicare quelle patch su un 16162306a36Sopenharmony_ciserver pubblico. 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ciRevisionare le patch 16462306a36Sopenharmony_ci-------------------- 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ciAlcuni lettori potrebbero avere obiezioni sulla presenza di questa sezione 16762306a36Sopenharmony_cinegli "argomenti avanzati" sulla base che anche gli sviluppatori principianti 16862306a36Sopenharmony_cidovrebbero revisionare le patch. É certamente vero che non c'è modo 16962306a36Sopenharmony_cimigliore di imparare come programmare per il kernel che guardare il codice 17062306a36Sopenharmony_cipubblicato dagli altri. In aggiunta, i revisori sono sempre troppo pochi; 17162306a36Sopenharmony_ciguardando il codice potete apportare un significativo contributo all'intero 17262306a36Sopenharmony_ciprocesso. 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ciRevisionare il codice potrebbe risultare intimidatorio, specialmente per i 17562306a36Sopenharmony_cinuovi arrivati che potrebbero sentirsi un po' nervosi nel questionare 17662306a36Sopenharmony_ciil codice - in pubblico - pubblicato da sviluppatori più esperti. Perfino 17762306a36Sopenharmony_ciil codice scritto dagli sviluppatori più esperti può essere migliorato. 17862306a36Sopenharmony_ciForse il suggerimento migliore per i revisori (tutti) è questo: formulate 17962306a36Sopenharmony_cii commenti come domande e non come critiche. Chiedere "Come viene rilasciato 18062306a36Sopenharmony_ciil *lock* in questo percorso?" funziona sempre molto meglio che 18162306a36Sopenharmony_ci"qui la sincronizzazione è sbagliata". 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ciDiversi sviluppatori revisioneranno il codice con diversi punti di vista. 18462306a36Sopenharmony_ciAlcuni potrebbero concentrarsi principalmente sullo stile del codice e se 18562306a36Sopenharmony_cialcune linee hanno degli spazio bianchi di troppo. Altri si chiederanno 18662306a36Sopenharmony_cise accettare una modifica interamente è una cosa positiva per il kernel 18762306a36Sopenharmony_cio no. E altri ancora si focalizzeranno sui problemi di sincronizzazione, 18862306a36Sopenharmony_cil'uso eccessivo di *stack*, problemi di sicurezza, duplicazione del codice 18962306a36Sopenharmony_ciin altri contesti, documentazione, effetti negativi sulle prestazioni, cambi 19062306a36Sopenharmony_ciall'ABI dello spazio utente, eccetera. Qualunque tipo di revisione è ben 19162306a36Sopenharmony_ciaccetta e di valore, se porta ad avere un codice migliore nel kernel. 192